mysql 5.7+ ngram已内置,需配置ngram_token_size、建索引时显式指定with parser ngram、查询仅支持natural language mode且关键词长度≥token_size,并重建旧索引。

MySQL 5.7+ 不需要“安装”ngram插件,它已内置;真正要解决的是配置生效、建索引写法、查询模式三处硬性约束,漏任一环都会查不到中文结果。
确认 ngram 是否已加载(别被错误提示骗了)
执行 SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'ngram'; 返回空不是失败——ngram 不注册为传统插件,不靠 INSTALL PLUGIN 加载。只要 MySQL 版本 ≥5.7.6,服务启动时自动就绪。
更可靠的验证方式是查变量:SHOW VARIABLES LIKE '%ngram%';,有返回且 ngram_token_size 值存在,说明配置已读取。
常见误判:看到错误 Plugin 'ngram' is not loaded 就去搜安装教程,实际是 my.cnf 没配或没重启,不是插件缺失。
必须在 my.cnf 中设置 ngram_token_size 并重启
ngram_token_size 是全局只读变量,无法用 SET GLOBAL 动态修改,改了也不生效。
- 编辑
my.cnf(Linux)或my.ini(Windows),在[mysqld]段下添加:ngram_token_size=2 - 值推荐设为 2 或 3:设为 1 会导致单字泛滥、索引膨胀、相关度失真;设为 4+ 则短词(如“数据”)可能无法命中“数据库”这类长词
- 改完必须重启 MySQL 服务,否则新建的全文索引仍按默认 token size(即 2)构建,但若你之前设过其他值又没重启,行为不可预期
建全文索引时必须显式声明 WITH PARSER ngram
即使 ngram 已启用、ngram_token_size 已配置,如果建索引语句里漏掉 WITH PARSER ngram,MySQL 会退回到默认的空格/标点分词器,对中文完全失效。
正确写法示例:
ALTER TABLE articles ADD FULLTEXT INDEX ft_title (title) WITH PARSER ngram;
注意:
-
WITH PARSER ngram必须写在语句末尾,不能省略,也不能写成USING ngram或其他变体 - 仅支持
INNODB和MYISAM引擎;表字符集必须是utf8mb4(utf8在 MySQL 8.0+ 已弃用,5.7 虽兼容但不推荐) - 不能对列加前缀,比如
content(100)会报错,必须是完整列名
AGAINST 查询只能用自然语言模式,且关键词长度受限
MATCH(col) AGAINST('关键词' IN NATURAL LANGUAGE MODE) 是唯一支持 ngram 的查询模式。布尔模式(IN BOOLEAN MODE)和查询扩展均不生效。
关键词长度必须 ≥ 当前 ngram_token_size 值:
- 若
ngram_token_size=2,搜'数'查不到任何结果;必须搜'数据'或更长词 - 搜
'数据库'时,ngram 会从中切出'数据'、'库'(不对,'库'长度不够)——实际切的是'数据'、'据库',所以匹配依赖重叠子串是否存在于索引中 - 想搜单字?只能把
ngram_token_size改为 1 并重建所有全文索引,但代价是索引体积暴增、查询变慢、排序混乱
最易忽略的一点:已有全文索引不会因修改 ngram_token_size 自动更新,必须 DROP 后重建,否则新配置对老索引无效。











