X

MySQL 內建的全文檢索搜尋 MATCH 和 AGAINST

SQL 要搜尋通常就是使用 LIKE,但是 LIKE 很慢,MySQL 本身就有內建 FULLTEXT Serch 可以使用~

  • 註:內容多的話,建議還是使用 Sphinx、Solr、ElasticSearch 等等

MySQL 內建的全文檢索搜尋 MATCH 和 AGAINST

MySQL 內建的全文索引搜尋引擎(FULLTEXT Search),這個已經很久了,以前就有在用,速度也都還蠻快的~

最近遇到想要解決 LIKE 慢的問題,想要用 MySQL 自己內建的解決,再重新複習使用,順便做個筆記~

FULLTEXT Search 有幾個條件:

  1. MyISAM 或 MySQL 5.6 以上的 InnoDB
  2. 欄位型態:char、varchar、text
  3. my.cnf 需要設定 [mysqld]
    • MyISAM:ft_min_word_len = 1 # 預設 4
    • InnoDB:innodb_ft_min_token_size = 1 # 預設 4
    • SHOW VARIABLES LIKE "ft_min_word_len"; # Value = 4
    • 註:索引詞長度,預設:4
    • 修改這參數設定需要重啟 MySQL,無法動態修改變數
  4. 若前面已經建立過 FULLTEXT Index,後面才修改 MySQL 的參數,需要 Rebuild index,可以使用下述:
    • REPAIR TABLE table_name;

MySQL FULLTEXT 建立與搜尋語法

FULLTEXT Index 建立

  • CREATE FULLTEXT INDEX index_name on table_name (`column_name`);

搜尋語法

  • SELECT `column_name` FROM `table_name` WHERE MATCH(`column_name`) AGAINST ('keyword' IN BOOLEAN MODE);
  • SELECT `column_name` FROM `table_name` WHERE MATCH(`column_name`) AGAINST ('+keyword -keyword2' IN BOOLEAN MODE); # 加減分
  • SELECT `column_name` FROM `table_name` WHERE MATCH(`column_name`) AGAINST ('keyword' IN BOOLEAN MODE) AND column_2 = 'example';

FULLTEXT Index 移除

  • ALTER TABLE table_name DROP INDEX `index_name`;

相關網頁

Tsung: 對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.
Related Post