我有一个带全文索引的表。此查询返回2个结果:
SELECT *
FROM SampleTable
WHERE ContentForSearch LIKE '% mount %'
ORDER BY 1
此查询返回1个结果:
SELECT *
FROM SampleTable
WHERE CONTAINS(ContentForSearch, '"mount"')
ORDER BY 1
在表格中添加单词“mount”的新实例会显示在搜索中。为什么呢?
我已经检查了停用词列表,因为我知道如何。这不会返回任何结果:
SELECT *
FROM sys.fulltext_stoplists
这不会返回任何结果:
SELECT *
FROM sys.fulltext_system_stopwords
WHERE stopword like '%mount%'
我还检查了索引是否是最新的,这返回了当前时间(减去几分钟)和0,表示空闲:
SELECT DATEADD(ss, FULLTEXTCATALOGPROPERTY('SampleTableCatalog','PopulateCompletionAge'), '1/1/1990') AS LastPopulated,
FULLTEXTCATALOGPROPERTY('SampleTableCatalog','PopulateStatus')
我还在字符串中进行了一些搜索,这些搜索未显示在CONTAINS结果中,以查看ASCII值是否奇怪(如果需要可以提供查询),但它们与显示的那些完全相同起来。
在数据库的一个副本上,有人跑了:
ALTER FULLTEXT INDEX ON SampleTable SET STOPLIST = OFF;
ALTER FULLTEXT INDEX ON SampleTable SET STOPLIST = SYSTEM;
这似乎解决了这个问题,但我不明白为什么,而且我做出不明白的变化感到很不舒服。
更新 Stoleg的评论最终导致了我的解决方案。在某个数据库服务器上以某种方式关闭了全文索引。当该数据库随后还原到另一台服务器时,即使新服务器正在更新索引,那些未在第一台服务器上编制索引的条目仍未编入索引。我发现这是通过使用Stoleg的查询来检查索引中缺少哪些行,然后检查这些行的修改日期(幸运地存储了)。我注意到数据库在另一台服务器上的日期行的模式不在索引中。问题服务器上的解决方案是打开全文索引并重建目录。至于如何关闭索引,我自己也不明白。 DBA关于如何解决它的评论是“我将全文搜索作为资源添加到集群节点。”
答案 0 :(得分:1)
嗯,显而易见的问题是:你的停止列表中是否有“挂载”?
Microsoft Configure and Manage Stopwords and Stoplists for Full-Text Search向您展示如何查询和更新停用词。
您可能还想查看Microsoft的general info on stoplist。
ADDED
不要侮辱(不是你听到侮辱)。方式太多次,人们说他们只是在他们认为有的时候检查了一些东西 - 查看错误的数据库等等。所以希望你确定。我把你的某些时间解释为使用like,而不是contains,所以我认为它更可能是停止列表。
唯一的另一个“明显”解决方案是重建全文索引 - 认为更改停止列表对其他数据库具有相同的效果。我想你也可以先重新启动服务器。但是,作为另一个神秘的解决方案,不是第一选择。
答案 1 :(得分:0)
更改与索引关联的全文停止列表(如果有)。
OFF
指定没有停止列表与全文索引相关联。SYSTEM
指定应将默认的全文系统STOPLIST用于此全文索引。stoplist_name
指定要与全文索引关联的停止列表的名称。有关详细信息,请参阅配置和管理全文搜索的停用词和停止列表。
这只是删除并将停止列表重置为系统默认值。
答案 2 :(得分:0)
这是因为'%mount%'中的额外空格 尝试:
SELECT *
FROM SampleTable
WHERE ContentForSearch LIKE '%mount%'
ORDER BY 1