news 2026/10/5 4:45:36

【高频面试题】FullText 全文索引(MySQL)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【高频面试题】FullText 全文索引(MySQL)

普通索引:匹配完整字段值,like '%关键词%'不走索引,扫描全表;

全文索引 FULLTEXT:专门用来在长文本(文章、标题、内容)中搜索单词 / 短语,分词检索,支持语义相关度排序。

1. 基础概念

  • 适用引擎:InnoDB(MySQL5.6 + 支持)、MyISAM
  • 支持字段类型:CHAR、VARCHAR、TEXT
  • 原理:把文本拆分成单词(token),建立单词 → 文档 ID 的倒排索引;搜索时按单词匹配,计算相关性分数。
  • 默认分词规则(英文):按空格、标点分割;中文默认不支持分词,需要插件(ngram 分词器)。

两个重要系统参数

  1. innodb_ft_min_token_size:InnoDB 最小单词长度,默认3。 小于 3 个字符的词不会被收录。
  2. ft_stopword_file:停用词列表(a,the,is,中文的 “的、了”),停用词不会进索引。

⚠️ 中文坑:原生全文索引不切中文词语,连续汉字当成一个字符串。

MySQL 提供ngram分词插件,按固定 N 元组切分中文。

2. 创建全文索引

建表时创建

CREATE TABLE article ( id INT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(200), content TEXT, FULLTEXT INDEX ft_article(title, content) -- 多字段联合全文索引 ) ENGINE=InnoDB;

已有表添加索引

ALTER TABLE article ADD FULLTEXT INDEX ft_article(title,content);

删除全文索引

ALTER TABLE article DROP INDEX ft_article;

3. 查询语法:MATCH() AGAINST()

语法:

MATCH(字段1,字段2) AGAINST ('搜索词' [搜索模式])

MATCH 指定要检索哪些字段,AGAINST 指定搜什么词,以及用哪种搜索规则。

返回值:相关性分数,分数越高代表匹配度越高。

3 种搜索模式

① 自然语言模式(默认IN NATURAL LANGUAGE MODE)

查找包含关键词的行,按相关性降序;不支持运算符。

SELECT id,title, MATCH(title,content) AGAINST ('java' IN NATURAL LANGUAGE MODE) AS score FROM article WHERE MATCH(title,content) AGAINST ('java');

规则:

  • 词出现频率太高(超过 50% 文档)会被当成停用词,搜不到!
  • 最小词长限制生效。
② 布尔模式IN BOOLEAN MODE

支持+ - > < * "短语"运算符,不计算相关性排序,只判定是否匹配。

符号含义
+java必须包含 java
-mysql不能包含 mysql
java*前缀匹配,java 开头单词 (java,javac)
"hello world"精确短语,连续完整词组
>word提高该词相关性
<word降低该词相关性

示例:必须有 java,不能有 spring

SELECT * FROM article WHERE MATCH(title,content) AGAINST ('+java -spring' IN BOOLEAN MODE);
③ 查询扩展模式WITH QUERY EXPANSION

先根据关键词找到相关文档,再提取文档里高频词做二次搜索,适合概念扩展,容易引入无关数据。

MATCH(title,content) AGAINST ('数据库' WITH QUERY EXPANSION);

4. 中文使用:ngram 分词器

ngram:把中文按 N 个字符滑动切分,ngram_token_size一般设 2(二元分词)。

建表指定 ngram 解析器

CREATE TABLE news( id INT PRIMARY KEY AUTO_INCREMENT, content TEXT, FULLTEXT INDEX ft_news(content) WITH PARSER ngram ) ENGINE=InnoDB;

注意:ngram_token_size=2,最小搜索长度是 2,不能搜单个汉字。

查询示例:

SELECT * FROM news WHERE MATCH(content) AGAINST ('深圳' IN NATURAL LANGUAGE MODE);

5. 全文索引优缺点

✅ 优点

  1. 相比like '%xxx%'全表扫描,全文索引检索速度快很多;
  2. 自带相关性打分,适合文章搜索场景;
  3. 支持布尔语法、短语匹配。

❌ 缺点

  1. 有最小词长限制,太短的词无法检索;
  2. 高频词(超过半数文档存在)在自然语言模式会被忽略;
  3. 中文原生不支持语义分词,ngram 会产生大量碎词,索引体积大;
  4. DML 开销大:新增 / 修改文本,需要维护倒排索引,写入性能下降;
  5. 不支持部分场景:不能用于ORDER BY以外复杂排序;不适合短字段精确匹配。

6. 什么时候不要用 MySQL FullText?

  • 大量中文搜索、需要分词(人名、专有名词)、高亮、分页权重、同义词 → 推荐 Elasticsearch / Solr
  • 只是简单模糊匹配短字符串 → 普通 B + 树索引 +like 'xxx%'(前缀匹配)

7. 常见踩坑

  1. MATCH的字段列表,必须和建立全文索引的字段完全一致,否则报错;
  2. 自然语言模式下,如果关键词在超过一半数据里存在,查不出结果;
  3. ngram 分词 token_size 一旦设置,不能在线修改,需要重建索引;
  4. AGAINST里不要直接拼接用户输入,防止注入。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/5 4:44:50

AI上下文模式实战指南:从概念到落地,避开四大坑

近半年“context-mode”这个词在开发者圈子和AI应用讨论里出现得越来越频繁。很多人把它当成一个普通的功能开关&#xff0c;实际使用中却总感觉哪里不对&#xff1a;要么给AI塞了一堆背景资料&#xff0c;结果它照样答非所问&#xff1b;要么费了半天劲整理的上下文文档&#…

作者头像 李华
网站建设 2026/10/5 4:43:59

RAG检索不准答案啰嗦?Reranker精排+MMR去冗余实战

1. 为什么检索做完了&#xff0c;答案还是不对做过企业级智能问答系统的人&#xff0c;大概率都经历过这个阶段&#xff1a;文档切好了&#xff0c;向量库也灌进去了&#xff0c;用户提问之后 Top-K 检索能召回一堆看起来相关的片段&#xff0c;但把这些片段直接丢给大模型&…

作者头像 李华
网站建设 2026/10/5 4:43:15

基于微信小程序的车位共享系统设计与Spring Boot全栈实现

如果你最近在找毕设题目&#xff0c;或者拿到“基于微信小程序的车位共享系统”这个题后不知道第一步做什么&#xff0c;这篇内容应该能帮你省不少时间。我自己做过几轮同类项目&#xff0c;最深的感觉是&#xff1a;这个题目看起来只是“小区停车位预约”&#xff0c;但实际做…

作者头像 李华
网站建设 2026/10/5 4:42:50

企业大模型网关与Agent工作流落地实践:架构设计与成本优化

1. 企业大模型网关到底解决什么问题1.1 从一个真实痛点说起去年帮一家做企业服务的团队做技术咨询&#xff0c;他们内部有七八个业务线都在调大模型接口&#xff0c;财务系统用一套 Key&#xff0c;客服系统用另一套&#xff0c;市场部的自动化文案工具又是单独申请的。结果月底…

作者头像 李华
网站建设 2026/10/5 4:42:18

P2161会场预约:用set与运算符重载解决区间相交判断

1. 从一道老题说起&#xff1a;会场预约到底在考什么我第一次见到P2161 [SHOI2009] 会场预约&#xff0c;是在一个算法讨论群里。有人贴出题面&#xff1a;“有N个操作&#xff0c;每次可以预约一个时间段&#xff0c;或者取消预约&#xff0c;要求实时输出当前被取消的预约数。…

作者头像 李华
网站建设 2026/10/5 4:42:00

失智照护虚拟仿真实训建设指南:从脚本设计到课程落地

失智照护实训怎么教&#xff0c;一直是护理教育里最头疼的环节之一。前两年我参与了一个虚拟仿真实训项目的建设&#xff0c;从需求调研、场景脚本设计到设备选型、课程落地全程跟了下来。中间被领导问过、被学生吐槽过、也被合作企业的技术员笑过&#xff0c;但最终项目运行起…

作者头像 李华