mysql5.7中提供了原生的全文检索能力,主要通过MATCH AGAINST函数实现文本内容的快速匹配,针对中文等非英文文本的场景,还可以结合分词插件提升检索的准确性和效率。

MATCH AGAINST函数基础用法
MATCH AGAINST是mysql5.7中用于全文检索的核心函数,需要与全文索引配合使用,首先我们需要创建带有全文索引的表。
创建全文索引示例
先创建一个存储文章内容的表,对文章内容字段添加全文索引:
-- 创建文章表
CREATE TABLE article (
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(100) NOT NULL,
content TEXT NOT NULL,
create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- 对content字段添加全文索引
ALTER TABLE article ADD FULLTEXT INDEX idx_content (content);
-- 也可以在建表时直接创建全文索引
CREATE TABLE article_v2 (
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(100) NOT NULL,
content TEXT NOT NULL,
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
FULLTEXT INDEX idx_content (content)
);
MATCH AGAINST函数查询语法
使用MATCH AGAINST进行检索的基本语法如下:
-- 基础全文检索查询
SELECT
id,
title,
content,
MATCH(content) AGAINST('mysql 全文检索') AS score
FROM article
WHERE MATCH(content) AGAINST('mysql 全文检索');
-- 不使用WHERE子句,直接返回匹配得分
SELECT
id,
title,
content,
MATCH(content) AGAINST('数据库优化') AS match_score
FROM article
ORDER BY match_score DESC;
上述查询中,MATCH(content)指定要检索的字段,AGAINST('检索关键词')指定检索的内容,返回结果中score字段表示匹配的相关度得分,得分越高匹配度越高。
分词插件配置与使用
mysql5.7默认的全文分词器对英文支持较好,会按照空格和标点分割单词,但对中文、日文等连续书写的文本支持不足,此时需要配置分词插件来实现更准确的分词。
ngram分词插件介绍
mysql5.7内置了ngram全文解析器,可以将文本按照指定长度的字符片段进行拆分,适合处理中文等无空格分隔的文本。首先需要修改mysql配置文件,启用ngram解析器:
[mysqld] # 启用ngram全文解析器,设置分词长度为2 ngram_token_size=2
修改配置后重启mysql服务,之后创建全文索引时指定使用ngram解析器即可。
使用ngram分词插件的全文索引创建
创建支持中文分词的的全文索引示例:
-- 创建带ngram分词的全文索引
ALTER TABLE article ADD FULLTEXT INDEX idx_content_ngram (content) WITH PARSER ngram;
-- 建表时直接创建带ngram分词的索引
CREATE TABLE article_cn (
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(100) NOT NULL,
content TEXT NOT NULL,
FULLTEXT INDEX idx_content_ngram (content) WITH PARSER ngram
);
分词插件配合MATCH AGAINST检索示例
使用带ngram分词的全文索引进行中文检索:
-- 插入测试中文数据
INSERT INTO article_cn (title, content) VALUES
('mysql教程', '本文介绍mysql5.7的全文检索功能使用方法'),
('数据库优化', '数据库优化可以提升查询效率,全文检索是常用优化手段');
-- 使用MATCH AGAINST进行中文检索
SELECT
id,
title,
content,
MATCH(content) AGAINST('全文检索') AS score
FROM article_cn
WHERE MATCH(content) AGAINST('全文检索')
ORDER BY score DESC;
使用注意事项
- 全文索引只支持
CHAR、VARCHAR、TEXT类型的字段,其他类型字段无法创建全文索引。 - 默认情况下,MATCH AGAINST检索会忽略长度小于4个字符的单词,这个阈值可以通过
ft_min_word_len参数调整。 - ngram分词的长度
ngram_token_size设置过大会增加索引大小,过小则可能无法准确匹配长关键词,一般中文场景设置为2或3即可。 - 全文检索的相关度得分是mysql内部计算的,受匹配词频、文档长度等因素影响,结果排序时可以结合其他字段调整。
性能优化建议
如果全文检索的表数据量较大,可以从以下几个方面优化:
- 只对需要检索的字段创建全文索引,避免不必要的索引占用存储空间。
- 定期分析表的使用情况,对碎片较多的全文索引进行优化。
- 对于高频检索的关键词,可以结合缓存机制减少数据库的检索压力。
- 如果检索场景非常复杂,也可以考虑将mysql的全文检索与专业的搜索引擎结合使用,各取所长。
mysql5.7全文检索MATCH_AGAINST分词插件修改时间:2026-07-01 08:57:20