ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

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

【高频面试题】FullText 全文索引(MySQL) 普通索引匹配完整字段值like %关键词%不走索引扫描全表全文索引 FULLTEXT专门用来在长文本文章、标题、内容中搜索单词 / 短语分词检索支持语义相关度排序。1. 基础概念适用引擎InnoDBMySQL5.6 支持、MyISAM支持字段类型CHAR、VARCHAR、TEXT原理把文本拆分成单词token建立单词 → 文档 ID 的倒排索引搜索时按单词匹配计算相关性分数。默认分词规则英文按空格、标点分割中文默认不支持分词需要插件ngram 分词器。两个重要系统参数innodb_ft_min_token_sizeInnoDB 最小单词长度默认3。 小于 3 个字符的词不会被收录。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) -- 多字段联合全文索引 ) ENGINEInnoDB;已有表添加索引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不能包含 mysqljava*前缀匹配java 开头单词 (java,javac)hello world精确短语连续完整词组word提高该词相关性word降低该词相关性示例必须有 java不能有 springSELECT * 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 ) ENGINEInnoDB;注意ngram_token_size2最小搜索长度是 2不能搜单个汉字。查询示例SELECT * FROM news WHERE MATCH(content) AGAINST (深圳 IN NATURAL LANGUAGE MODE);5. 全文索引优缺点✅ 优点相比like %xxx%全表扫描全文索引检索速度快很多自带相关性打分适合文章搜索场景支持布尔语法、短语匹配。❌ 缺点有最小词长限制太短的词无法检索高频词超过半数文档存在在自然语言模式会被忽略中文原生不支持语义分词ngram 会产生大量碎词索引体积大DML 开销大新增 / 修改文本需要维护倒排索引写入性能下降不支持部分场景不能用于ORDER BY以外复杂排序不适合短字段精确匹配。6. 什么时候不要用 MySQL FullText大量中文搜索、需要分词人名、专有名词、高亮、分页权重、同义词 → 推荐 Elasticsearch / Solr只是简单模糊匹配短字符串 → 普通 B 树索引 like xxx%前缀匹配7. 常见踩坑MATCH的字段列表必须和建立全文索引的字段完全一致否则报错自然语言模式下如果关键词在超过一半数据里存在查不出结果ngram 分词 token_size 一旦设置不能在线修改需要重建索引AGAINST里不要直接拼接用户输入防止注入。
返回列表