MySQL 早期全文檢索僅支援空格分詞 (英文),中文需外掛 (MeCab 等)。5.7 內建 **ngram parser**,支援 MyISAM/InnoDB,無額外安裝。
[mysqld]
ngram_token_size=2 -- 分詞粒度 (1~10),2=雙字元 (推薦平衡精度/索引大小)
修改後**重啟生效**,現有全文索引需 `REPAIR TABLE` 或 `ALTER TABLE ... DROP INDEX ... ADD FULLTEXT ...` 重建。
CREATE TABLE articles (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT (title, body) WITH PARSER ngram
) ENGINE=InnoDB CHARACTER SET utf8mb4;
INSERT INTO articles (title, body) VALUES
('數據庫管理', '在本教程中我將向你展示如何管理數據庫'),
('數據庫應用開發', '學習開發數據庫應用程序'),
('MySQL完全手冊', '學習MySQL的一切'),
('數據庫與事務處理', '系統的學習數據庫的事務概論'),
('NoSQL精髓', '學習了解各種非結構化數據庫'),
('SQL 語言詳解', '詳細了解如果使用各種SQL');
SET GLOBAL innodb_ft_aux_table = 'test/articles'; -- 指定分析目標表
SELECT * FROM information_schema.INNODB_FT_INDEX_CACHE LIMIT 20, 10;
輸出範例 (ngram_token_size=2):`數據`、`據庫`、`庫管`、`管理`... 每兩字一組,含 `DOC_ID`、`POSITION` 等位置資訊。
-- 符合筆數
SELECT COUNT(*) FROM articles
WHERE MATCH(title, body) AGAINST('數據庫' IN NATURAL LANGUAGE MODE);
-- 結果: 4
-- 相關性分數
SELECT id, MATCH(title, body) AGAINST('數據庫' IN NATURAL LANGUAGE MODE) AS score
FROM articles;
-- id=1,2,4 分數 0.124;id=5 分數 0.062 (僅 body 含);id=3,6 分數 0
-- 必須同時包含「數據庫」和「管理」
SELECT * FROM articles
WHERE MATCH(title, body) AGAINST('+數據庫 +管理' IN BOOLEAN MODE);
-- 僅 id=1
-- 包含「數據庫」但排除「管理」
SELECT * FROM articles
WHERE MATCH(title, body) AGAINST('+數據庫 -管理' IN BOOLEAN MODE);
-- id=2,4,5
-- 提升「MySQL」權重,降低「數據庫」權重
SELECT * FROM articles
WHERE MATCH(title, body) AGAINST('>數據庫 +MySQL' IN BOOLEAN MODE);
-- 僅 id=3 (MySQL完全手冊)
SELECT * FROM articles
WHERE MATCH(title, body) AGAINST('數據庫' WITH QUERY EXPANSION);
-- 兩階段:先自然語言搜尋 → 取高相關文檔關鍵詞 → 二次搜尋
-- 結果: 6 筆全命中 (含 MySQL、SQL、NoSQL 等相關詞擴展)
| 操作符 | 含義 | 範例 |
|---|---|---|
| + | 必須包含 | +數據庫 |
| - | 必須不包含 | -管理 |
| > | 提高相關性 | >數據庫 |
| < | 降低相關性 | <管理 |
| () | 分組 | +(數據庫 管理) |
| ~ | 模糊/否定貢獻 | ~噪音詞 |
| * | 前綴通配 (僅詞尾) | 數據* |
| "" | 精確短語 | "數據庫管理" |
MySQL 5.7 內建 ngram 讓中文全文檢索零依賴、零部署,三大搜尋模式覆蓋從相關性排序到精確邏輯再到語義擴展的主流需求,是中小型應用快速上線中文搜尋的最佳選擇。