全文搜索偶尔查找单词

时间:2014-08-13 13:59:39

标签: sql sql-server full-text-search

我有一个带全文索引的表。此查询返回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关于如何解决它的评论是“我将全文搜索作为资源添加到集群节点。”

3 个答案:

答案 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