建立全文索引
CREATE TABLE articles (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT(title, body)
) ENGINE=MyISAM; -- InnoDB 5.6+ 也支援
- 大量導入資料時,先導入再建索引 (ALTER TABLE ADD FULLTEXT) 極快;先建索引再導入極慢。
- MyISAM/InnoDB 均支援,InnoDB 5.6+ 才支援。
基本查詢:MATCH ... AGAINST
-- 自然語言模式 (預設)
SELECT * FROM articles
WHERE MATCH(title, body) AGAINST('database');
-- 布林模式 (精確控制)
SELECT * FROM articles
WHERE MATCH(title, body) AGAINST('+MySQL -YourSQL' IN BOOLEAN MODE);
布林模式操作符速查
| 符號 | 含義 |
| + | 必須包含 |
| - | 必須不包含 |
| * | 通配符 (僅尾部) |
| "..." | 短語精確匹配 |
| ~ | 降低相關性 |
中文分詞痛點與解法
- 內建 parser 僅按空白/標點切分,中文無空格 → 無法分詞。
- 方案:
- 應用層分詞 (jieba、IK) 寫入專用
keywords 欄位,建全文索引。
- 使用 ngram parser (MySQL 5.7.6+):
FULLTEXT(title, body) WITH PARSER ngram,自動按 bigram 切分。
- 外掛 parser (如 mysql-jieba) 編譯安裝,效果最佳但維護成本高。
效能提示
- 全文索引不支援
ORDER BY 相關性外的排序,需子查詢或應用層排序。
- 最小詞長
ft_min_word_len (MyISAM) / innodb_ft_min_token_size (InnoDB) 預設 3/4,中文建議設 1 或 2。
- 停用詞表
ft_stopword_file 可自訂。