SQL Server 2016全文检索CONTAINS单字符'n'匹配数字异常问题
问题原因分析与解决方法
这个现象其实和SQL Server全文检索的英文语言分词器的数字处理逻辑有关,我来给你拆解一下:
核心原因
当你为全文索引指定LANGUAGE 'English'时,SQL Server的英文分词器会自动将数字转换为对应的英文单词进行索引。比如你测试数据里的789会被转换为seven hundred eighty nine,其中nine是以n开头的单词——这就是为什么CONTAINS(N'"n*"')会返回那条全数字的记录。
而用"a*"查询时,数字对应的英文单词里没有以a开头的(比如one、two、three这些都不沾边),所以不会匹配到数字记录。
你可以通过查询全文索引的关键词来验证这一点:
SELECT * FROM sys.dm_fts_index_keywords(DB_ID(), OBJECT_ID('Content'))
你会看到nine这个关键词,对应的就是那条包含789的记录。
解决方法
根据你的需求,有几种方案可选:
1. 切换全文索引的语言为中性(Neutral)
中性语言的分词器不会进行词干分析或数字转英文的操作,只会按字符进行分词。这样"n*"就只会匹配以字母n开头的单词,不会涉及数字:
-- 先删除原全文索引 DROP FULLTEXT INDEX ON [dbo].[Content] -- 重新创建,指定语言为Neutral CREATE FULLTEXT INDEX ON [Content]([content] LANGUAGE 'Neutral') KEY INDEX [PK_Content] ON ([ContentCatalog], FILEGROUP [PRIMARY]) WITH (CHANGE_TRACKING = AUTO, STOPLIST = SYSTEM)
2. 查询时过滤数字记录(按需使用)
如果需要保留英文分词的其他功能,只是想排除纯数字的记录,可以在查询时添加额外条件:
SELECT * FROM [dbo].[Content] WHERE CONTAINS([Content], N'"n*"') -- 排除纯数字的记录(注意:如果记录里同时有n开头单词和数字,这条会过滤掉,按需选择) AND [content] NOT LIKE '%[0-9]%'
3. 自定义停用词表(不推荐,仅特殊场景)
如果你想保留英文分词,但想排除数字对应的英文单词,可以自定义停用词表,把所有数字对应的英文单词(比如nine、nineteen等)加入停用词,但这种方法维护成本很高,一般不推荐。
内容的提问来源于stack exchange,提问作者ApceH Hypocrite
相关产品推荐
相关产品推荐

