MySQL BOOLEAN模式MATCH AGAINST检索'IT'无结果原因及解决方法
问题原因
这个问题和SQL写法无关,是MySQL全文索引的默认规则限制导致的:
- MyISAM引擎的全文索引默认最小索引词长参数
ft_min_word_len值为4,构建索引时所有长度小于4的词都会被直接过滤,不会写入全文索引。存储的关键词IT长度仅为2,根本没有被纳入索引,自然无法被检索到;而cool长度刚好为4,满足默认索引规则,所以可以正常返回匹配结果。 - 字段里的
IT,cool会被默认全文解析器按标点切分为IT和cool两个独立词,不存在分词错误的问题。 - 补充:如果使用InnoDB引擎,对应的最小词长参数是
innodb_ft_min_token_size,默认值为3,同样会过滤掉长度为2的IT。另外默认英文停词表包含小写it,大小写不敏感匹配时也可能被过滤,但这个场景下核心影响因素是最小词长限制。
修复方案
按以下步骤操作即可解决问题:
- 修改MySQL配置文件(Linux环境为
my.cnf,Windows环境为my.ini),在[mysqld]配置段下添加/修改参数,调小最小索引词长度:
如果使用MyISAM引擎,添加配置:
ft_min_word_len = 2
如果使用InnoDB引擎,添加配置:
innodb_ft_min_token_size = 2
*如果需要支持单字符检索,可以把参数值改为1。
2. (可选)如果需要避免短词被停词规则过滤,可以配置空停词文件关闭默认停词过滤:
ft_stopword_file = ''
- 重启MySQL服务,让配置参数生效。
- 重建目标表的全文索引,配置修改前生成的旧索引不会自动更新,必须重建才能让符合长度要求的短词写入索引:
-- 快速修复表索引,重建全文索引 REPAIR TABLE `test` QUICK;
如果上述命令不生效,也可以手动删除后重建全文索引:
-- 先删除原有全文索引,索引名如果自定义过请替换为实际名称 ALTER TABLE `test` DROP INDEX title; -- 重新创建全文索引 ALTER TABLE `test` ADD FULLTEXT INDEX ft_title_body (title, body);
- 重建完成后重新执行检索SQL,即可正常返回包含
IT的结果:
SELECT * FROM `test` WHERE MATCH (title, body) AGAINST ('IT' IN BOOLEAN MODE);
替代方案(无需修改全局配置)
如果表数据量不大,不想修改数据库全局配置,也可以放弃全文索引,直接用LIKE做模糊匹配,只是性能会低于全文索引:
SELECT * FROM `test` WHERE title LIKE '%IT%' OR body LIKE '%IT%';
内容的提问来源于stack exchange,提问作者step
相关产品推荐
相关产品推荐

