SQL 要搜尋通常就是使用 LIKE,但是 LIKE 很慢,MySQL 本身就有內建 FULLTEXT Serch 可以使用~
- 註:內容多的話,建議還是使用 Sphinx、Solr、ElasticSearch 等等
MySQL 內建的全文檢索搜尋 MATCH 和 AGAINST
MySQL 內建的全文索引搜尋引擎(FULLTEXT Search),這個已經很久了,以前就有在用,速度也都還蠻快的~
最近遇到想要解決 LIKE 慢的問題,想要用 MySQL 自己內建的解決,再重新複習使用,順便做個筆記~
FULLTEXT Search 有幾個條件:
- MyISAM 或 MySQL 5.6 以上的 InnoDB
- 欄位型態:char、varchar、text
- 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,無法動態修改變數
- 若前面已經建立過 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`;
相關網頁
- MYSQL全文索引及Match() against()踩坑紀錄
- 用mysql fulltext search建立簡易搜尋引擎.最近因為公司的關係開始碰elasticsearch(一個功能強大的search…
- MySQL MATCH AGAINST
- AGAINST('keyword' IN NATURAL LANGUAGE MODE);
- AGAINST('keyword AND keyword2' IN BOOLEAN MODE);
- AGAINST('SQL' WITH QUERY EXPANSION);