傳統 SELECT ... LIKE '%keyword%' 在大量資料下效能極差,且無法智能排序相關性。
只需標記欄位為 FULLTEXT 索引,再用 MATCH() AGAINST() 查詢,MySQL 會自動建立索引優化搜尋,並以自然語言處理對結果評分,過濾無關資料。
CREATE TABLE reviews (
id INT(5) PRIMARY KEY NOT NULL AUTO_INCREMENT,
data TEXT
);
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);
SELECT id FROM reviews WHERE MATCH(data) AGAINST('single');
-- 返回 id 1, 2
SELECT id, MATCH(data) AGAINST('rock') FROM reviews;
-- id 3 得分 1.386,其餘為 0
+single -madonna:必須含 single、排除 madonna。hot*:前綴匹配,找 hot、hotter 等。hell rocks:至少含一個詞(隱含 OR)。SELECT id FROM reviews WHERE MATCH(data) AGAINST('+single -madonna' IN BOOLEAN MODE);
SELECT id FROM reviews WHERE MATCH(data) AGAINST('hot*' IN BOOLEAN MODE);
SELECT id FROM reviews WHERE MATCH(data) AGAINST('hell rocks' IN BOOLEAN MODE);
全文搜尋比 LIKE 更高效、更智能,下次開發搜尋介面請優先考慮 MATCH ... AGAINST。