gpt4 book ai didi

SQL Server 围绕数字和下划线进行全文搜索

转载 作者:行者123 更新时间:2023-12-02 20:17:45 26 4
gpt4 key购买 nike

使用 SQL Server 2012(通常使用 SQL Server 2008 R2 到 SQL Server 2016)

这个问题是 SQL-Server Full Text Index Unexpected results 的更具体的重新措辞。请参阅此处了解我们是如何走到这一步以及已经尝试过什么。

我现在重新发布,我们已经找到了具体的错误。非常感谢 @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

数据:

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

SELECT 2:错过结果集中的第 2 行

SELECT *
FROM TestFullTextSearch
WHERE CONTAINS (AllText, '"123_*"')

Id AllText
----------- ------------
1 123_456 789
3 123_456 ABC
4 ABC 123_456

SELECT 3:仅返回第 2 行

SELECT *
FROM TestFullTextSearch
WHERE CONTAINS (AllText, '"123\_*"')

Id AllText
----------- ------------
2 789 123_456

结论:如果前面的单词是数字字符串,则搜索以下划线后缀的数字字符串将失败。

问题:我们的客户使用全文搜索,并期望围绕零件编号和目录引用提供结果,这些结果可能会或可能不会出现在包含其他数字字符串的文本部分中。全文搜索似乎并没有以一致的方式支持这一点。

非常感谢您的帮助。

注意:此问题不会发生在 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)

我使用当前的解析器: enter image description here

恢复到旧解析器后: enter image description here

所以它已经产生了效果,但我仍然得到相同的结果。

2008 年和 2012 年之间的全文搜索是否存在任何其他差异可能会产生这种影响?

最佳答案

他们更改了 SQL 2008 和 SQL 2012 之间的全文解析器/词干分析器。

通过更改注册表,您可以使用旧版解析器,它应该更适合您的情况。

有关详细信息,请参阅 https://technet.microsoft.com/en-us/library/gg509108(v=sql.110).aspx

如果您需要同时支持新旧风格,那么您可以将美国英语恢复为旧风格,并保留英国英语为新风格(反之亦然)

使用 SQL 2016,我恢复了英国英语并保持美国英语不变:

exec sp_help_fulltext_system_components 'wordbreaker', 1033

exec sp_help_fulltext_system_components 'wordbreaker', 2057

返回: Screenshot showing fts components

我使用英国英语创建了另一个表并填充了它。

CREATE TABLE TestFullTextSearch2 (Id INT NOT NULL, AllText NVARCHAR(400))

CREATE UNIQUE INDEX test_tfts2 ON TestFullTextSearch2(Id)


CREATE FULLTEXT INDEX ON TestFullTextSearch2(AllText language 2057)
KEY INDEX test_tfts2 ON ftcat_tfts
WITH CHANGE_TRACKING AUTO, STOPLIST OFF

INSERT INTO TestFullTextSearch2
VALUES (1, ' 123_456 789 '), (2, ' 789 123_456 '),
(3, ' 123_456 ABC '), (4, ' ABC 123_456 ')

我得到了所有 3 个查询的预期 4 个结果。

Results of FTS queries

验证您的更改是否已生效。

exec sp_help_fulltext_system_components 'wordbreaker', 1033

exec sp_help_fulltext_system_components 'wordbreaker', 2057

select t.name, c.* from sys.tables t inner join sys.fulltext_index_columns c on t.object_id = c.object_id

关于SQL Server 围绕数字和下划线进行全文搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48802273/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com