SQL Full Text Search 如何禁用横杠分词功能解决查询异常
问题根因
- 默认FTS分词器会将连字符
-识别为分词分隔符,所以Blood-Oranges会被拆分为Blood、Oranges两个独立的索引项,导致FTS判定记录1也包含Oranges关键词 - 你当前查询语句中搜索的关键词是
"Orange"(单数),和需要匹配的Oranges(复数)不匹配,结合NOT逻辑后最终无结果返回
解决方案
方案一:自定义分词规则禁用连字符分词(根源解决)
不同数据库的配置方式略有差异,核心逻辑都是将-从分词分隔符的字符集中移除,配置完成后重建全文索引即可生效:
- SQL Server环境:先创建自定义全文非索引字表,修改断字规则将
-标记为普通字符,再重建表的全文索引:-- 从系统默认字表生成自定义字表 CREATE FULLTEXT STOPLIST CustomTagStoplist FROM SYSTEM STOPLIST; -- 完成断字规则配置后重建索引 ALTER FULLTEXT INDEX ON contacts REBUILD; - MySQL环境:修改
ft_boolean_syntax系统变量移除-的分隔属性,或使用ngram分词器配置普通字符白名单,之后重建全文索引即可。
方案二:临时调整查询逻辑适配现有规则
如果暂时不需要修改分词配置,可以调整查询语句同时结合全文检索和普通字符串匹配实现需求:
SELECT taglist, * FROM contacts WHERE NOT CONTAINS(taglist, '"Oranges"') AND taglist NOT LIKE '%Oranges%'
调整后即可正确排除包含单独Oranges的记录2,仅返回记录1。
内容的提问来源于stack exchange,提问作者Master
相关产品推荐
相关产品推荐

