首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 全文搜尋實戰:拋棄 LIKE,擁抱 MATCH AGAINST

     編輯:MySQL 資料庫相關知識

為什麼不用 LIKE?

傳統 SELECT ... LIKE '%keyword%' 在大量資料下效能極差,且無法智能排序相關性。

MySQL 內建全文索引方案

只需標記欄位為 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。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved