MySQL 3.23.23+ 支援全文索引(FULLTEXT),僅適用於 MyISAM 表的 CHAR、VARCHAR、TEXT 欄位。
-- 建表時
CREATE TABLE articles (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT (title, body)
) ENGINE=MyISAM;
-- 事後新增
ALTER TABLE articles ADD FULLTEXT (title, body);
-- 或
CREATE FULLTEXT INDEX ft_idx ON articles (title, body);
效能提示:大量資料先匯入、再建立索引(ALTER TABLE)遠快於先建索引再匯入。
使用 MATCH() ... AGAINST(),預設為自然語言模式,不分大小寫,按相關性遞減排序。
SELECT * FROM articles
WHERE MATCH (title, body) AGAINST ('database');
SELECT id, MATCH (title, body) AGAINST ('Tutorial') AS score
FROM articles;
分數為非負浮點數,0 表示不相關。計算依據:詞頻、唯一詞數、全集詞頻、文檔頻率(TF-IDF 變體)。
SELECT id, body,
MATCH (title, body) AGAINST ('Security implications of running MySQL as root') AS score
FROM articles
WHERE MATCH (title, body) AGAINST ('Security implications of running MySQL as root');
優化器會合併雙重 MATCH() 呼叫,無額外開銷。
'、_ 組成的序列。SELECT * FROM articles WHERE MATCH (title, body) AGAINST ('MySQL');
若搜尋詞出現在超過 50% 的行中,視為停用詞,回傳空集合。這是設計使然,避免高頻詞汙染結果。
MySQL 4.0.1+ 支援,不受 50% 閾值限制,不自動按相關性排序。
| 操作符 | 含義 | 範例 |
|---|---|---|
+ | 必須包含 | +MySQL |
- | 必須不包含 | -YourSQL |
(無) | 可選,包含者排序較前 | MySQL |
> / < | 增加/降低基礎權重 | +apple +(>pie <strudel) |
() | 分組 | +apple +(pie strudel) |
~ | 負向貢獻(噪聲詞),降低排序但不排除 | ~noise |
* | 截斷符(置於詞尾) | apple* 匹配 apple, apples, applesauce |
"..." | 片語精確匹配 | "some words" |
-- 必須含 MySQL,排除 YourSQL
SELECT * FROM articles
WHERE MATCH (title, body) AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);
MATCH() 參數必須來自同一張表,且屬於同一個 FULLTEXT 索引(布林模式除外)。MATCH() 欄位列表須與索引定義完全一致(布林模式除外)。AGAINST() 參數必須為常數字串。ft_min_word_len:最小索引詞長度(預設 4)。修改後需重建索引。ft_stopword_file:自訂停用詞檔案路徑。修改後需重建索引。修改 myisam/ftdefs.h:
#define GWS_IN_USE GWS_PROB
→ #define GWS_IN_USE GWS_FREQ
重編譯 MySQL 後生效,但會嚴重降低相關性判斷能力,建議改用布林模式。
REPAIR TABLE tbl_name QUICK;
CREATE/ALTER TABLE 參數