使用 SQL Server 2012(通常使用 SQL Server 2008 R2 到 SQL Server 2016)
这个问题是更具体的重新措辞SQL-Server 全文索引意外结果 https://stackoverflow.com/questions/48788921/sql-server-full-text-index-unexpected-results?noredirect=1#comment84585533_48788921。请参阅此处了解我们是如何走到这一步以及已经尝试过什么。
我现在重新发布,我们已经找到了具体的错误。非常感谢@蜜獾 https://stackoverflow.com/users/1587819/honeybadger.
走到这一步,他的帮助是无价的。
表结构:
CREATE TABLE TestFullTextSearch (Id INT NOT NULL, AllText NVARCHAR(400))
CREATE UNIQUE INDEX test_tfts ON TestFullTextSearch(Id)
CREATE FULLTEXT CATALOG ftcat_tfts
CREATE FULLTEXT INDEX ON TestFullTextSearch(AllText)
KEY INDEX test_tfts ON ftcat_tfts
WITH CHANGE_TRACKING AUTO, STOPLIST OFF
Data:
INSERT INTO TestFullTextSearch
VALUES (1, ' 123_456 789 '), (2, ' 789 123_456 '),
(3, ' 123_456 ABC '), (4, ' ABC 123_456 ')
请注意,此数据纯粹是为了演示该问题,并不表示实时数据集。我们的实时数据集可能超过 500,000 行,并且搜索单个字段中的数据段落 - 因此使用全文搜索。
选择1:结果符合预期
SELECT *
FROM TestFullTextSearch
WHERE CONTAINS (AllText, '"123*"')
Id AllText
----------- ------------
1 123_456 789
2 789 123_456
3 123_456 ABC
4 ABC 123_456
选择 2:错过结果集中的第 2 行
SELECT *
FROM TestFullTextSearch
WHERE CONTAINS (AllText, '"123_*"')
Id AllText
----------- ------------
1 123_456 789
3 123_456 ABC
4 ABC 123_456
选择 3:只返回第2行
SELECT *
FROM TestFullTextSearch
WHERE CONTAINS (AllText, '"123\_*"')
Id AllText
----------- ------------
2 789 123_456
结论:如果前面的单词是数字字符串,则搜索以下划线后缀的数字字符串将失败。
Problem:我们的客户使用全文搜索,并期望围绕零件编号和目录参考提供结果,这些结果可能会或可能不会出现在包含其他数字字符串的文本部分中。全文搜索似乎并没有以一致的方式支持这一点。
非常感谢任何帮助。
注意:此问题不会发生在 SQL SERVER 2008 上,但会发生在 2012+ 上
我也尝试过切换到旧版本的 FTS 解析器。测试用
SELECT * FROM sys.dm_fts_parser (' "789 123_456" ',1033,0,0)
SELECT * FROM sys.dm_fts_parser (' "789 123_456" ',2057,0,0)
I had with current parser:
And after reverting to the legacy parser:
所以它已经产生了效果,但我仍然得到相同的结果。
2008 年和 2012 年之间的全文搜索是否存在任何其他差异可能会产生这种影响?