即使停用词列表为空,如果包含停用词,全文搜索也不起作用

Posted

技术标签:

【中文标题】即使停用词列表为空,如果包含停用词,全文搜索也不起作用【英文标题】:Full text search does not work if stop word is included even though stop word list is empty 【发布时间】:2012-09-27 08:45:22 【问题描述】:

我希望能够搜索每个单词,因此我清除了停用词列表。比我重建的索引。但不幸的是,如果我输入一个带有停用词的搜索表达式,它仍然不会返回任何行。如果我只省略停用词,我会得到结果。例如。 “双重磨损留在原地” - 没有结果,“双重磨损留在原地” - 我得到的结果实际上也包含“in”。

有人知道为什么会这样吗?我正在使用 SQL Server 2012 Express。

非常感谢!

【问题讨论】:

【参考方案1】:

如果有人感兴趣,我在 apolka 的答案中充实了检查关联查询,以提供更清晰的结果:

--Check the association:
SELECT
    ft_c.name AS [Catalog],
    s.name AS [Schema],
    o.name AS [Table],
    [StopList] =
    CASE
        WHEN ft_i.stoplist_id IS NULL THEN 'None'
        ELSE ISNULL(ft_sl.NAME, 'System')
    END
FROM 
    sys.fulltext_indexes AS ft_i LEFT OUTER JOIN
    sys.fulltext_stoplists AS ft_sl ON ft_sl.stoplist_id = ft_i.stoplist_id INNER JOIN
    sys.fulltext_catalogs AS ft_c ON ft_c.fulltext_catalog_id = ft_i.fulltext_catalog_id INNER JOIN
    sys.objects AS o ON o.object_id = ft_i.object_id INNER JOIN
    sys.schemas AS s ON s.schema_id = o.schema_id

SSMS 中缺少这些东西太愚蠢了!

【讨论】:

【参考方案2】:

根据我的研究,它与全文索引停止列表选项有关,它是全文索引的主要属性之一。 如果将此选项设置为“系统”,则“系统停止列表”中包含的所有关键字都将不适用于您的 CONTAINS() 子句,不幸的是,此类情况将没有结果集。 解决方案;

将此选项设置为“关闭”,这将绕过您的语言集中的停止列表检查。 例如英语中的 you,土耳其语中的 sen。这些被标记为停用词,并且对于在此类搜索中排除 SQL Server 引擎是有意义的,除非您设置“系统”选项。所以,不要使用“系统”选项。 为此,请在您的表所在的数据库上运行以下脚本:

ALTER FULLTEXT INDEX ON table_name SET STOPLIST = OFF

创建您自己的停止列表。在这种情况下,您可以定义您的特殊停用词并创建特定的停用词列表。因此,只有这些将被处理,因为它们对 SQL Server 引擎没有任何意义。 创建后,您可以通过运行以下脚本开始使用它:

CREATE FULLTEXT STOPLIST myStoplist

GO

ALTER FULLTEXT STOPLIST [myStoplist] ADD 'you' LANGUAGE 'English'

GO

ALTER FULLTEXT INDEX ON table_name SET STOPLIST = [myStoplist]

GO

我希望这会有所帮助:) 祝你好运...

【讨论】:

【参考方案3】:

与此同时,我已经设法解决了这个问题。问题是我有自己的停止列表,它确实是空的,但我的全文目录不是与我自己的停止列表相关联,而是与系统之一相关联。以下是解决停用词和全文搜索问题的几个有用查询:

查询停用词(不返回系统停用词!):

select * from sys.fulltext_stopwords

查询停止列表(不返回系统列表!):

select * from sys.fulltext_stoplists

检查目录中包含哪些单词:

SELECT * FROM sys.dm_fts_index_keywords(DB_ID('dbname'), OBJECT_ID('tablename'))

检查关联:

select fulltext_catalog_id,stoplist_id, * from sys.fulltext_indexes;

关闭停止列表:

ALTER FULLTEXT INDEX ON CremeSearchFT SET STOPLIST = OFF

我希望它对某人有所帮助。 :)

【讨论】:

您的意思是您的“全文目录”与非索引字表或您的“全文索引”无关?我自己的停止列表有问题。 能看到系统列表和系统列表吗!

以上是关于即使停用词列表为空,如果包含停用词,全文搜索也不起作用的主要内容,如果未能解决你的问题,请参考以下文章

忽略查询中的mysql全文停用词

SQL 2008:关闭全文搜索查询的停用词

我可以以编程方式配置 PostgreSQL 以不消除全文搜索中的停用词吗?

mysql 全文索引(四)停用词

Spacy - 自定义停用词不起作用

NLTK 可用于停用词的语言