SQL CONTAINS查询无法按预期工作

时间:2018-02-16 15:47:07

标签: sql sql-server

我有一个带有nchar(32)列的表,激活了全文搜索和自动更改跟踪。

数据集:

Name, SuperID 
Item1, (LO}(bJ$
Item2, (LO}(bJ$
Item3, (LO}(bJ$

我运行两个查询:

select Name, SuperID from Asset A WHERE A.SuperID LIKE
N'%(LO}(bJ$%' 

select Name, SuperID from Asset A WHERE (   CONTAINS
(A.SuperID ,N'"(LO}(bJ$"')  )

第一行返回 3 行,第二行只返回 1 行。

为什么会这样?如何分析全文搜索索引的内容?前三个结果中的列值相同。我试图更新索引/统计数据,但这不会改变结果

更新 我试过删除CONTAINS查询周围的引号但我收到一条错误消息:

  

“全文搜索条件中的'''附近的语法错误

UPDATE2:

我想我应该以不同的方式表达我的问题,我想!看看我想要返回的三行的SuperID列值。我已将它们转换为VARBINARY以确保没有隐藏的尾随空间欺骗,它们实际上是相同的:

SuperIDasBinary
0x28004C004F007D00280062004A0024002...
0x28004C004F007D00280062004A0024002...
0x28004C004F007D00280062004A0024002...

那么为什么上面的CONTAINS查询只返回一行而不是三行?

2 个答案:

答案 0 :(得分:1)

有一个忽略噪音字/字符的列表,这被称为停止列表。 您可以使用with change_tracking auto, stoplist off更改索引。您可以使用select * from sys.dm_fts_parser('"(LO}(bJ$"', 1033, null, 0)进行测试。这将产生3个搜索令牌,而不是现在的2个。此命令中的null表示要使用的停止列表,或者更确切地说,因为它为null,不应使用停止列表。但是,这只能解决$,其他字符仍然被忽略。我希望这有助于解决您的问题,但我现在无法自行测试。

答案 1 :(得分:1)

在尝试使用单独的数据库中的新表重新创建问题时,我最终比较了全文目录设置。在我看到错误行为的数据库中,表全文待定更改值为21219(!)。

然后检查了FT日志,发现资产表很长时间没有更新:

  

在数据库' - '和表上加载数据以进行爬网的内部查询   '资产'失败,错误代码为1205.请检查sql错误代码以获取更多信息   有关导致此故障的情况的信息。爬行需要   删除此条件后重新启动。

以及

  

错误:30059,严重性:16,状态:1   在全文人群中发生致命错误并导致人口被取消。   人口类型是:AUTO;数据库名称为Media(id:6);目录名称   是 - (id:6);表名资产(id:1076966963)。固定   全文爬网日志中记录的错误。然后,恢复   人口。用于此的基本Transact-SQL语法是:ALTER   table_name RESUME POPULATION上的FULLTEXT索引。“

我不得不手动恢复FT更新。之后,搜索返回了3个项目!