MS SQL 全文搜索查询结果不符合预期,如何匹配含指定子串的记录
解决方案
你遇到的两个问题可通过以下方式调整查询:
根因说明
FORMSOF(INFLECTIONAL, 关键词)仅匹配同一单词的屈折变化形式(如动词时态、名词单复数),不会匹配前缀相同的不同单词,因此传入gen无法命中generation- 标准
CONTAINS(name, 'test')默认仅匹配作为独立词存在的精确test,如果需要覆盖前缀相同的相关词汇,需要搭配全文检索的通配符语法
调整方案
场景1:只需前缀匹配(满足输入gen命中generation、输入test命中this is a test case类记录)
使用CONTAINS前缀通配符语法,关键词放在双引号内,末尾加*:
-- 匹配所有name列中包含以gen开头的单词的记录,覆盖gen、generation、gens等场景 SELECT * FROM dbo.zones WHERE CONTAINS(name, '"gen*"'); -- 匹配所有name列中包含以test开头的单词的记录,覆盖test、testing、tested、短语中独立test等场景 SELECT * FROM dbo.zones WHERE CONTAINS(name, '"test*"');
场景2:同时需要屈折变化+前缀匹配
如果需要同时覆盖单词的屈折变化和前缀匹配场景,用逻辑运算符组合两个条件即可:
SELECT * FROM dbo.zones WHERE CONTAINS(name, 'FORMSOF(INFLECTIONAL, gen) OR "gen*"');
特殊场景:任意位置包含关键词的模糊匹配
如果需要匹配单词任意位置包含关键词的场景(比如输入est命中test),可以用LIKE语法,但该语法无法使用全文索引,数据量较大时会有性能损耗:
SELECT * FROM dbo.zones WHERE name LIKE '%gen%';
内容的提问来源于stack exchange,提问作者Ranveer
相关产品推荐
相关产品推荐

