Sql 全文搜索仅偶尔查找单词

Sql 全文搜索仅偶尔查找单词,sql,sql-server,full-text-search,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的新实例添加到表中会显示在搜索中。为什么? 我已经尽我所能检查了停止语列表。这不会返回任何结果

我有一个带有全文索引的表。此查询返回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%'
这不会返回任何结果:

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的查询来检查索引中缺少哪些行,然后检查存储的行的修改日期来发现这一点的。我注意到这样一种模式,即数据库位于另一台服务器上的日期中的行不在索引中。问题服务器上的解决方案是打开全文索引并重建目录。至于索引是如何关闭的,我自己也不明白。DBA关于如何解决此问题的评论是,我将全文搜索作为资源添加到集群节点

那么,一个显而易见的问题是:“装载”是否在你的停止列表中

Microsoft向您展示了如何查询和更新停止词

您可能还想查看来自Microsoft的

增加

不要把你听起来受了侮辱当作侮辱。很多时候,人们说他们只在认为自己检查过的时候检查过一些东西——查看了错误的数据库,等等,所以希望你确认一下。我把你的一些时间解释为与like一起工作,而不是与contains一起工作,所以我认为实际上更可能是与stoplist一起工作

另一个显而易见的解决方案是重建全文索引——考虑到更改停止列表对其他数据库的影响相同。我想你也可以先重启服务器。但是,作为另一个神秘的解决方案,这不是第一选择

更改与索引关联的全文停止列表(如果有)

关 指定没有与全文索引关联的停止列表

系统 指定此全文索引应使用默认的全文系统停止列表

停止列表名称 指定要与全文索引关联的停止列表的名称

有关更多信息,请参阅配置和管理全文搜索的停止字和停止列表


这只是删除并将停止列表重置为系统默认值

这是因为“%mount%”中有额外的空格 尝试:

挑选* 从抽样表 其中ContentForSearch,如“%mount%”
ORDER BY 1

正如我在问题中所说,我已经检查了停止列表,没有看到装载。此外,如果mount出现在stoplist中,它似乎永远也找不到mount这个词,但有时它会找到它。您可以查看哪些内容被注册为分词器,也可能是过滤器。我不确定这些与重置停止列表如何修复它有什么关系。另外,当您对示例表运行此查询时,您是否有LUCode和RUCode的结果不是32?选择m.StringMatch,LEFTm.StringMatch,1作为L1,UnicodeFTM.StringMatch,1作为LUCode,rightm.StringMatch,1作为R1,UNICODErightm.StringMatch,1作为RUCode从样本st交叉应用选择子字符串ContentForSearch,charindex“mount”,ContentForSearch,7作为StringMatch作为m,其中st.ContentForSearch类似“%mount%”;什么是列数据类型?搜索词应为NVARCHAR。请尝试Containes内容搜索,N'mount'。《珠穆朗玛峰》中的第一个角色真的有空格吗?Db排序规则是什么?试着检查装载是否到达索引:选择*from sys.dm_fts_index_keywords_by_document Db_ID‘database_name’、OBJECT_ID‘table_name’在第二个实例中它没有到达索引应该有原因。请您删除并重新创建索引。您还可以将查询的输出张贴在有用的位之上。这并不能解释为什么contains不能得到这些结果。去掉空格只会显示更多与单词无关的结果,比如mountain。