MySQL如何实现高效的全文搜索技巧

来源:APP编程网作者:大卫头衔:程序员
导读:本期聚焦于小伙伴创作的《MySQL如何实现高效的全文搜索技巧》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《MySQL如何实现高效的全文搜索技巧》有用,将其分享出去将是对创作者最好的鼓励。

MySQL的全文搜索是专门用于处理文本字段内容检索的功能,通过FULLTEXT索引对文本内容进行分词和索引,能够快速匹配包含指定关键词的记录,相比LIKE '%关键词%'的全表扫描模式,性能有显著提升,适合文章、评论、商品描述等文本类数据的检索场景。

全文搜索的基础配置

MySQL的MyISAM和InnoDB存储引擎都支持全文搜索,不过不同版本的支持范围有区别,MySQL 5.6及以上版本的InnoDB引擎才完整支持全文搜索。首先需要确认数据库的默认存储引擎,同时全文搜索有最小分词长度的限制,默认是4个字符,也就是长度小于4的词不会被索引,这个参数可以通过修改配置文件调整。

查看当前最小分词长度的命令如下:

-- 查看全文搜索最小分词长度
SHOW VARIABLES LIKE 'ft_min_word_len';
-- 查看InnoDB引擎的全文搜索相关配置
SHOW VARIABLES LIKE 'innodb_ft%';

创建FULLTEXT索引

使用全文搜索的前提是给目标文本字段创建FULLTEXT索引,支持单个字段索引,也支持多个字段的组合索引。创建索引的语法和普通索引类似,只是指定索引类型为FULLTEXT。

首先创建测试表:

-- 创建文章表,包含标题和内容两个文本字段
CREATE TABLE article (
    id INT PRIMARY KEY AUTO_INCREMENT,
    title VARCHAR(200) NOT NULL,
    content TEXT NOT NULL,
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

给title和content字段创建组合FULLTEXT索引:

-- 创建全文索引,覆盖title和content字段
ALTER TABLE article ADD FULLTEXT INDEX ft_idx_title_content (title, content);
-- 也可以通过创建表的时候直接指定
-- CREATE TABLE article (
--     id INT PRIMARY KEY AUTO_INCREMENT,
--     title VARCHAR(200) NOT NULL,
--     content TEXT NOT NULL,
--     create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
--     FULLTEXT INDEX ft_idx_title_content (title, content)
-- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

常用的全文搜索语法

创建好索引之后,就可以使用MATCH() AGAINST()语法进行全文搜索,MATCH后面跟要建立索引的字段,AGAINST后面跟搜索的关键词。

基础全文搜索

查询标题或者内容中包含MySQL关键词的文章:

-- 基础全文搜索,匹配title或content中包含MySQL的记录
SELECT id, title, content
FROM article
WHERE MATCH(title, content) AGAINST('MySQL');

布尔模式搜索

如果需要更精准的搜索控制,可以使用布尔模式,支持的逻辑运算符包括:+表示必须包含,-表示必须不包含,*表示通配符,空格表示或关系。

例如查询必须包含MySQL,且不包含Oracle,同时包含索引或者优化的文章:

-- 布尔模式全文搜索
SELECT id, title, content
FROM article
WHERE MATCH(title, content) AGAINST('+MySQL -Oracle (索引 优化)' IN BOOLEAN MODE);

相关性排序

全文搜索默认会返回匹配的相关性得分,得分越高表示匹配度越高,可以按照得分降序排列,让最相关的结果排在前面。

-- 返回相关性得分,并按得分降序排列
SELECT id, title, content,
       MATCH(title, content) AGAINST('MySQL 全文搜索' IN BOOLEAN MODE) AS score
FROM article
WHERE MATCH(title, content) AGAINST('MySQL 全文搜索' IN BOOLEAN MODE)
ORDER BY score DESC;

中文全文搜索的适配

MySQL默认的全文分词是按照空格和标点来拆分英文单词,对中文的支持不好,中文句子没有空格分隔,默认会把整个句子当成一个词,导致搜索不准确。如果需要支持中文全文搜索,可以使用MySQL的ngram全文解析器,它会按照指定的长度对文本进行切分,比如设置ngram_token_size为2,就会把中文文本按2个字一组拆分。

创建支持中文的FULLTEXT索引示例:

-- 先设置ngram解析器,创建支持中文的全文索引
ALTER TABLE article ADD FULLTEXT INDEX ft_idx_title_content_cn (title, content) WITH PARSER ngram;
-- 查看ngram相关配置
SHOW VARIABLES LIKE 'ngram_token_size';

使用ngram解析器后,搜索中文关键词就能正常匹配到对应的内容了。

注意事项

  • 全文搜索只适合文本类型的字段,比如CHAR、VARCHAR、TEXT类型,不支持数值、日期等类型。
  • 修改了ft_min_word_len或者ngram_token_size参数之后,需要重建FULLTEXT索引才能生效。
  • 数据量比较小的时候,全文搜索的优势不明显,当文本数据超过十万级的时候,性能优势会比较突出。
  • 布尔模式下通配符*只能放在关键词的末尾,不能放在开头。

MySQL全文搜索FULLTEXT索引修改时间:2026-06-11 13:54:21

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。