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

apo*_*lka 14 sql-server full-text-search stop-words sql-server-2012-express

我希望能够搜索每个单词,所以我已经清除了单词列表.比我重建了索引.但不幸的是,如果我输入一个带有停用词的搜索表达式,它仍然不会返回任何行.如果我遗漏了停止词,我会得到结果.例如"双重磨损留在原地" - 没有结果,"双重磨损停留的地方" - 我得到的结果实际上也包含"in".

有谁知道为什么会这样?我正在使用SQL Server 2012 Express.

非常感谢!

apo*_*lka 31

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

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

select * from sys.fulltext_stopwords
Run Code Online (Sandbox Code Playgroud)

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

select * from sys.fulltext_stoplists
Run Code Online (Sandbox Code Playgroud)

检查目录中包含的单词:

SELECT * FROM sys.dm_fts_index_keywords(DB_ID('dbname'), OBJECT_ID('tablename'))
Run Code Online (Sandbox Code Playgroud)

检查关联:

select fulltext_catalog_id,stoplist_id, * from sys.fulltext_indexes;
Run Code Online (Sandbox Code Playgroud)

关闭停止列表:

ALTER FULLTEXT INDEX ON CremeSearchFT SET STOPLIST = OFF
Run Code Online (Sandbox Code Playgroud)

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


小智 6

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

将此选项设置为“ OFF”将绕过停止列表检查您的语言设置。例如,用英语讲,用土耳其语讲。这些标记为停用词,除非您设置“ system”选项,否则将在此类搜索中排除SQL Server Engine是有意义的。因此,请勿使用“系统”选项。为此,请在表所在的db上运行以下脚本:

ALTER FULLTEXT INDEX ON table_name SET STOPLIST = OFF
Run Code Online (Sandbox Code Playgroud)

创建自己的停止清单。在这种情况下,您可以定义特殊的停用词并创建特定的停用列表。这样一来,仅这些将被视为对SQL Server Engine没有任何意义。创建它之后,可以通过运行以下脚本开始使用它:

CREATE FULLTEXT STOPLIST myStoplist

GO

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

GO

ALTER FULLTEXT INDEX ON table_name SET STOPLIST = [myStoplist]

GO
Run Code Online (Sandbox Code Playgroud)

希望对您有所帮助:)祝您好运...


小智 5

如果有人感兴趣,我在 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
Run Code Online (Sandbox Code Playgroud)

SSMS 中缺少这个东西真是太愚蠢了!