全文搜索偶尔查找单词

use*_*861 7 sql sql-server full-text-search

我有一个带全文索引的表.此查询返回2个结果:

SELECT *
FROM SampleTable
WHERE ContentForSearch LIKE '% mount %'
ORDER BY 1
Run Code Online (Sandbox Code Playgroud)

此查询返回1个结果:

SELECT *
FROM SampleTable
WHERE CONTAINS(ContentForSearch, '"mount"')
ORDER BY 1
Run Code Online (Sandbox Code Playgroud)

在表中添加单词"mount"的新实例确实会显示在搜索中.为什么?

我已经检查了停用词列表,因为我知道如何.这不会返回任何结果:

SELECT *
FROM sys.fulltext_stoplists
Run Code Online (Sandbox Code Playgroud)

这不会返回任何结果:

SELECT *
FROM sys.fulltext_system_stopwords
WHERE stopword like '%mount%'
Run Code Online (Sandbox Code Playgroud)

我还检查了索引是否是最新的,这返回了当前时间(减去几分钟)和0,表示空闲:

SELECT DATEADD(ss, FULLTEXTCATALOGPROPERTY('SampleTableCatalog','PopulateCompletionAge'), '1/1/1990') AS LastPopulated,
    FULLTEXTCATALOGPROPERTY('SampleTableCatalog','PopulateStatus')
Run Code Online (Sandbox Code Playgroud)

我还在字符串中进行了一些搜索,这些搜索没有显示在CONTAINS结果中,以查看ASCII值是否奇怪(如果需要可以提供查询),但它们与显示的那些完全相同.

在数据库的一个副本上,有人跑了:

ALTER FULLTEXT INDEX ON SampleTable SET STOPLIST = OFF;
ALTER FULLTEXT INDEX ON SampleTable SET STOPLIST = SYSTEM;
Run Code Online (Sandbox Code Playgroud)

这似乎解决了它,但我不明白为什么,我不舒服做出我不明白的变化.

更新 Stoleg的评论最终促成了我的解决方案.在某个数据库服务器上以某种方式关闭了全文索引.当该数据库随后还原到另一台服务器时,即使新服务器正在更新索引,那些未在第一台服务器上编制索引的条目仍未编入索引.我发现这是通过使用Stoleg的查询来检查索引中缺少哪些行,然后检查这些行的修改日期(幸运地存储了).我注意到数据库在另一台服务器上的日期行的模式不在索引中.问题服务器上的解决方案是打开全文索引并重建目录.至于如何关闭索引,我自己也不明白.DBA关于如何解决它的评论是"我将全文搜索作为资源添加到集群节点".

Gar*_*ker 1

那么,显而易见的问题是:“mount”在您的非索引字列表中吗?

Microsoft配置和管理全文搜索的停用词和非索引字列表向您展示如何查询和更新停用词。

您可能还想查看Microsoft 的非索引字列表的一般信息。

添加

不要认为这是侮辱(不是你听起来被侮辱了)。很多时候,人们说他们已经检查了一些东西,而他们只是认为自己检查了错误的数据库等等。所以希望你确认一下。我有时将您解释为与 like 一起使用,而不是与 contains 一起使用,所以我认为它更可能实际上是非索引字表。

唯一的其他“明显”解决方案是重建全文索引 - 认为更改非索引字表对其他数据库具有相同的效果。我想你也可以先重新启动服务器。但是,作为另一个神秘的解决方案,不是首选。