不能。MySQL 5.7 原生 MATCH AGAINST 不支持中文分词,仅按空格/标点切分,需依赖 ngram(内置,字元切分)或 MeCab(第三方,语义分词)插件实现中文全文检索。

MySQL 5.7 中 MATCH AGAINST 能否直接分词?
不能。MySQL 原生 MATCH AGAINST 不做中文分词,它只按空格、标点切分单词——对中文就是整字段当一个“词”,查不到子串。比如字段存“苹果手机很好用”,搜“苹果”或“手机”默认匹配失败。
必须装分词插件才能支持中文全文检索
MySQL 5.7 官方不带中文分词能力,得靠第三方插件,最常用的是 MeCab(日文/中文通用)或 ngram(MySQL 内置,但 5.7 只支持 ngram,且是字元切分,非语义分词)。
-
ngram是 MySQL 5.7 唯一内置分词插件,启用后对中文按 N 字切分(如 ngram_token_size=2 → “苹果”→“苹”“苹果”“果”),适合短词匹配,但会产生大量无意义碎片 - 若需真正语义分词(如识别“iPhone15”“iOS17”为独立词),必须编译安装
MeCab插件并配置词典,过程涉及 C++ 编译、字符集适配、权限控制,生产环境慎用 - 插件启用后,建表时需显式指定
WITH PARSER ngram(或mechab),否则MATCH仍走默认空格分词
正确建表 + 查询的最小可行步骤
以 ngram 为例,跳过编译插件的复杂路径,聚焦能跑通的实操链路:
- 确认插件已加载:
SHOW PLUGINS;查看ngram状态是否为ACTIVE - 建表时指定全文索引与解析器:
CREATE TABLE articles ( id INT PRIMARY KEY, title TEXT, FULLTEXT(title) WITH PARSER ngram ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
- 插入数据后,
ANALYZE TABLE articles;强制更新全文索引统计 - 查询必须用
IN NATURAL LANGUAGE MODE或IN BOOLEAN MODE,例如:SELECT * FROM articles WHERE MATCH(title) AGAINST('苹果' IN NATURAL LANGUAGE MODE); - 注意:ngram 默认
ngram_token_size=2,搜单字(如“果”)可能命中,但不可控;调大该值会显著增加索引体积和查询延迟
常见报错与绕不过去的坑
遇到 ERROR 1191 (HY000): Can't find FULLTEXT index matching the column list?不是没建索引,而是没配对解析器——FULLTEXT 索引声明里漏了 WITH PARSER ngram,或者用了 MyISAM 引擎(5.7 中 InnoDB 才支持 ngram)。
- 插入含 emoji 或四字节 UTF-8 的数据时,若表字符集不是
utf8mb4,全文索引会静默丢弃这些字符,查不到结果也不报错 -
AGAINST()中的搜索词不会被分词器处理,它原样传入;所以搜“iPhone”要确保分词器词典里有这个词,否则切不出有效 token - InnoDB 全文索引有 stopword 机制,默认过滤掉常见虚词(如“的”“了”),但 ngram 对中文 stopword 支持有限,实际效果不稳定
分词本质是权衡:ngram 简单但粗粒度,MeCab 精准但运维成本高。多数业务场景下,先用 ngram 验证逻辑,再评估是否值得上外部检索服务(如 Elasticsearch)。


















