我有一个带有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查询只返回一行而不是三行?
答案 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个项目!