LIKE '%keyword%' 無法使用索引,大表全掃描極慢,且無相關性排序,結果噪音大。
CREATE TABLE reviews (
id INT(5) PRIMARY KEY AUTO_INCREMENT,
data TEXT
) ENGINE=MyISAM; -- 5.6+ InnoDB 也支援
INSERT INTO reviews (data) VALUES
('Gingerboy has a new single out called Throwing Rocks. It\'s great!'),
('Hello all, I really like the new Madonna single. One of the hottest tracks...'),
('Have you heard the new band Hotter Than Hell? They have five members...');
ALTER TABLE reviews ADD FULLTEXT INDEX (data);
SHOW INDEXES FROM reviews;
-- Key_name: data, Index_type: FULLTEXT
按相關性降序返回,智能識別停用詞、詞幹。
SELECT * FROM reviews
WHERE MATCH(data) AGAINST('new single');
返回包含 "new"、"single" 的記錄,按出現頻率、位置、長度加權排序。
SELECT * FROM reviews
WHERE MATCH(data) AGAINST('+new -Madonna' IN BOOLEAN MODE);
| 操作符 | 含義 |
|---|---|
+ | 必須包含 |
- | 必須不包含 |
* | 通配符(置於詞尾) |
"..." | 短語精確匹配 |
>< | 增加/降低權重 |
~ | 降低權重(模糊匹配) |
SELECT * FROM reviews
WHERE MATCH(data) AGAINST('database' WITH QUERY EXPANSION);
先按自然語言搜尋,取前幾行高頻詞自動擴展查詢,再二次搜尋。適合用戶查詢詞過短。
ft_min_word_len),修改需重建索引。ft_stopword_file。WITH PARSER ngram),無需分詞器即可中文全文檢索。DROP INDEX,導完再 ADD FULLTEXT INDEX,避免逐行維護索引開銷。OPTIMIZE TABLE 整理碎片,提升檢索速度。