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"')
这个问题可能是我们服务器特有的,但是我从症状上看不出问题出在哪里。
我在 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"')