前置知识: MySQL

全文索引

1 minIntermediate2026/6/14

MySQL全文索引:FULLTEXT索引创建、自然语言模式、布尔模式、n-gram解析器与中文分词

1. 全文索引概述

MySQL 全文索引(FULLTEXT Index)支持对文本内容进行全文检索,InnoDB 和 MyISAM 均支持。

2. 创建全文索引

-- 创建表时定义
CREATE TABLE articles (
    id      INT AUTO_INCREMENT PRIMARY KEY,
    title   VARCHAR(200),
    content TEXT,
    FULLTEXT INDEX ft_title_content (title, content)
) ENGINE = InnoDB;

-- 在已有表上创建
ALTER TABLE articles ADD FULLTEXT INDEX ft_content (content);

-- 使用 n-gram 解析器(支持中文)
ALTER TABLE articles ADD FULLTEXT INDEX ft_content (content)
    WITH PARSER ngram;

3. 搜索模式

3.1 自然语言模式

-- 默认模式,按相关性排序
SELECT * FROM articles
WHERE MATCH(title, content) AGAINST('数据库 索引');

-- 获取相关性分数
SELECT *, MATCH(title, content) AGAINST('数据库 索引') AS score
FROM articles
WHERE MATCH(title, content) AGAINST('数据库 索引')
ORDER BY score DESC;

3.2 布尔模式

-- 支持操作符
SELECT * FROM articles
WHERE MATCH(title, content) AGAINST('+MySQL -索引' IN BOOLEAN MODE);

-- 操作符说明:
-- +  必须包含
-- -  必须不包含
-- 无  可选,包含则提高相关性
-- >  提高权重
-- <  降低权重
-- *  通配符(前缀匹配)
-- "  短语匹配
-- () 分组
-- ~  取反(降低相关性)

-- 短语匹配
SELECT * FROM articles
WHERE MATCH(content) AGAINST('"MySQL索引优化"' IN BOOLEAN MODE);

-- 前缀匹配
SELECT * FROM articles
WHERE MATCH(content) AGAINST('数据*' IN BOOLEAN MODE);

3.3 查询扩展模式

-- 两阶段搜索:先搜关键词,再用结果中的词扩展搜索
SELECT * FROM articles
WHERE MATCH(content) AGAINST('数据库' WITH QUERY EXPANSION);

4. n-gram 解析器

-- 中文分词支持
-- ngram_token_size = 2(默认,双字分词)

CREATE TABLE chinese_articles (
    id      INT AUTO_INCREMENT PRIMARY KEY,
    title   VARCHAR(200),
    content TEXT,
    FULLTEXT INDEX ft_content (content) WITH PARSER ngram
) ENGINE = InnoDB;

-- 搜索中文
SELECT * FROM chinese_articles
WHERE MATCH(content) AGAINST('数据库' IN NATURAL LANGUAGE MODE);

5. 限制与注意事项

-- 最小词长度:innodb_ft_min_token_size = 3(默认)
-- ngram 时由 ngram_token_size 决定

-- 全文索引不支持前缀索引
-- 全文索引列不支持排序
-- 全文索引不支持 % 通配符
-- 建议在数据导入完成后再创建全文索引