全文索引基礎
- 支持引擎:MyISAM(MySQL 5.6+ InnoDB 也支持)。
- 適用列類型:
CHAR、VARCHAR、TEXT。
- 創建方式:
- 建表時:
FULLTEXT (title, body)
- 後添加:
ALTER TABLE articles ADD FULLTEXT (title, body) 或 CREATE FULLTEXT INDEX idx_title_body ON articles (title, body)
- 大數據導入技巧:先導數據、後建索引(極快);帶索引導入極慢。
自然語言模式(默認)
SELECT * FROM articles
WHERE MATCH (title, body) AGAINST ('database');
- 不區分大小寫。
- 返回結果按**相關性降序**排列。
- 相關性算法:詞頻(TF)、逆文檔頻率(IDF)、文檔長度歸一化。
- 50% 閾值限制:若搜索詞出現在 ≥50% 行中,視為「常用詞」自動忽略(相關性 0)。示例:表中 6 行,「MySQL」出現 3 次以上 → 搜索 "MySQL" 返回空集。
- 最小詞長
ft_min_word_len(默認 4),停用詞表 ft_stopword_file。
布爾模式(IN BOOLEAN MODE)
SELECT * FROM articles
WHERE MATCH (title, body) AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);
- 無 50% 閾值,可搜索高頻詞。
- 不自動按相關性排序,需手動
ORDER BY MATCH(...) AGAINST(...) DESC。
- 支持操作符:
| 操作符 | 含義 |
+ | 必須包含 |
- | 必須不包含 |
> / < | 增加/降低權重 |
() | 分組 |
~ | 負權重(降噪,不完全排除) |
* | 通配符(僅作後綴,如 apple*) |
"" | 短語精確匹配 |
- 無全文索引也可工作(全表掃描,極慢)。
實用查詢示例
| 需求 | 查詢 |
| 包含 "apple" 和 "juice" | +apple +juice |
| 包含 "apple",若也含 "macintosh" 則權重更高 | +apple macintosh |
| 包含 "apple" 但不含 "macintosh" | +apple -macintosh |
| 包含 "apple" 且 ("pie" 或 "strudel"),"apple pie" 權重更高 | +apple +(>pie <strudel) |
| 以 "apple" 開頭的詞 | apple* |
| 精確短語 "some words" | "some words" |
配置調優(需重建索引生效)
ft_min_word_len:最小詞長(默認 4),改為 1 可索引單字母,修改後 REPAIR TABLE tbl QUICK。
ft_stopword_file:自定義停用詞文件路徑,修改後重建索引。
- 禁用 50% 閾值:修改源碼
myisam/ftdefs.h #define GWS_IN_USE GWS_PROB → GWS_FREQ,重新編譯 MySQL(**不推薦**,改用布爾模式)。
ft_boolean_syntax:布爾操作符字符串(只讀,源碼 myisam/ft_static.c 定義)。
限制與注意事項
MATCH() 列列表必須**精確匹配**某個全文索引的列定義(除非布爾模式)。
AGAINST() 參數必須是**常量字符串**,不能用列/變量。
- 多字節字符集(UTF-8 中文)在早期版本分詞不準,5.7+ 引入 ngram parser 解決:
FULLTEXT INDEX idx (col) WITH PARSER ngram。
- 不支持
MERGE 表、不支持近接搜索、無詞幹提取。
重建索引命令
REPAIR TABLE articles QUICK;
總結
MySQL 全文搜索適合**中小規模、中文分詞需求不極致**的場景。大規模、高精度、實時性要求高的系統建議接入 Elasticsearch、Solr、Meilisearch 或 PostgreSQL pg_trgm/zhparser。理解自然語言模式的 50% 閾值、布爾模式操作符、最小詞長配置,是用好 MySQL 全文搜索的關鍵。