SQL 全文索引、区分大小写和数字的服务器异常

SQL Server oddity with full-text indexing and case sensitivity and numbers

这个问题可能是我们服务器特有的,但是我从症状上看不出问题出在哪里。

我在 table (fsItems) 中有一个字段 (searchtitle) 打开了全文索引。对于主键 (IDItem) 704629 的记录,该字段的内容是“TEST AFA 0 TEST”。

令人惊讶的是,以下查询returns没有结果:

SELECT * FROM fsItems WHERE CONTAINS(searchtitle,'AFA') AND IDItem = 704629

但是,如果我将内容更改为“TEST afa 0 TEST”或“TEST AFA O TEST”(大写“O”而不是零),则查询 returns 记录。 (如果我将内容更改为“TEST AFB 0 TEST”并将 CONTAINS 参数更改为 'AFB',它也会 returns 记录。)

起初我以为 AFA 可能是某种停用词,但这并不能解释为什么将零更改为大写“O”returns 是正确的结果。

知道这里发生了什么吗?

感谢任何建议

非常有趣的小怪癖。看起来 SQL 服务器正在将“AFA 0”视为单个“单词”。我猜这是为标准英语配置的断字符的问题。看起来你可以手动调整它们,但它看起来并不简单或直观。请参阅 Microsoft 的操作说明文档 here

识别 Full-text 索引中的词

下面的脚本列出了全文索引中的每个单词。如果您 运行 这与您的 table 相对,您将在 display_term 列中看到单词“AFA 0”。旁注:此脚本在优化全文索引方面也非常有用,它可以识别要添加到停用列表中的“嘈杂”词

Select *
From sys.dm_fts_index_keywords(Db_Id(),Object_Id('dbo.tbl_fulltext_test') /*Replace with your table name*/)
Order By document_count Desc

完整 SQL 用于确定问题

CREATE TABLE tbl_fulltext_test
(ID int constraint PK_fulltext_test primary key identity (1,1) 
,String Varchar(1000)
)

Create Fulltext Catalog ct_test
With Accent_Sensitivity = Off

Create Fulltext Stoplist sl_test
From System Stoplist;

Create Fulltext Index On tbl_fulltext_test(String)
Key Index PK_fulltext_test On ct_test
With Stoplist = sl_test,Change_Tracking Auto;


INSERT INTO tbl_fulltext_test
VALUES 
 ('TEST AFA 0 TEST') /*Zero*/
,('TEST afa 0 TEST') /*Zero*/
,('TEST AFB 0 TEST') /*AFB*/
,('TEST AFA O TEST') /*Letter O*/

/*Returns rows 2 and 4*/
SELECT *
FROM tbl_fulltext_test
WHERE CONTAINS (String,'AFA')

/*Returns row 1*/
SELECT *
FROM tbl_fulltext_test
WHERE CONTAINS (String,'"AFA 0"')