MySQL 內建 Fulltext(僅支援 MyISAM,5.6+ InnoDB 也支援)
建立索引
CREATE TABLE articles (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT (title, body)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
基本查詢
-- 自然語言模式(預設)
SELECT * FROM articles WHERE MATCH(title, body) AGAINST('北京 奧運');
-- 布林模式(支援 + - > < ~ * ")
SELECT * FROM articles WHERE MATCH(title, body) AGAINST('+apple -banana' IN BOOLEAN MODE);
-- 查詢擴展(自動擴展關鍵詞)
SELECT * FROM articles WHERE MATCH(title, body) AGAINST('北京' WITH QUERY EXPANSION);
布林操作符速查
| 符號 | 含義 | 範例 |
| + | 必須包含 | +apple |
| - | 必須不包含 | -banana |
| > | 提高相關性 | >apple |
| < | 降低相關性 | |
| () | 分組 | +apple +(>banana |
| ~ | 降低排序值 | +apple ~banana |
| * | 尾部萬用字元 | appl* |
| " " | 精確短語 | "+apple pie" |
中文全文搜尋痛點
內建 Fulltext 以空格/標點分詞,中文無分隔符 → 無法正確分詞,搜尋「北京奧運」找不到「北京 奧運」。
解決方案:mysqlcft 插件(Google 開源)
特點
- 「三字節交叉切分演算法」:無需詞庫,精準度接近
LIKE '%...%'
- 查詢速度比 LIKE 快 3-50 倍
- 標準插件式安裝,不修改 MySQL 原始碼
- 支援 MySQL 5.1.22~5.1.25 RC,字元集:GBK/GB2312/UTF-8/Latin1/BIG5
- 僅支援 MyISAM 表
安裝步驟
# 1. 下載對應版本 .so 檔
wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/mysqlcft/mysqlcft-1.0.1-linux-x86_64.tar.gz
tar xzf mysqlcft-*.tar.gz
# 2. 複製到 plugin 目錄
cp mysqlcft.so /usr/lib/mysql/plugin/
# 3. 安裝插件
INSTALL PLUGIN mysqlcft SONAME 'mysqlcft.so';
# 4. 建立中文全文索引
ALTER TABLE articles ADD FULLTEXT INDEX ft_title_body (title, body) WITH PARSER mysqlcft;
# 5. 查詢(語法相同)
SELECT * FROM articles WHERE MATCH(title, body) AGAINST('北京 奧運');
替代方案對比
| 方案 | 中文支援 | 效能 | 維護成本 | 適用場景 |
| MySQL 內建 Fulltext | ❌ 需預分詞 | 高 | 低 | 英文/已分詞資料 |
| mysqlcft | ✅ 無詞庫自動分詞 | 高 | 低 | 中文中小型資料 |
| Sphinx / Manticore | ✅ 專業分詞 | 極高 | 中(獨立服務) | 大規模、高併發搜尋 |
| Elasticsearch | ✅ 最強分詞 | 極高 | 高(叢集運維) | 全文搜尋引擎級需求 |
| 應用層分詞 + 倒排索引表 | ✅ 可控 | 中 | 高(自研) | 特殊業務邏輯 |
選型建議
- 資料量 < 1000 萬、團隊無運維能力 → mysqlcft 或應用層分詞
- 資料量 > 1000 萬、需即時索引、多語言 → Elasticsearch
- 已有 Sphinx 基礎設施 → 繼續用 Manticore(Sphinx 分支)