2012年8月29日 星期三

在 MySQL 中做全文檢索

因為想要能夠提供一個 API,能夠回應資料庫當中哪些資料包含了指定的 key
因此查了一些資料,目前是打算用 MySQL 的 FULL TEXT SEARCH 的功能。

要使用 MySQL 的全文檢索,資料表型態必須是 MyISAM,同時要做全文檢索的欄位型態要是 FULLTEXT
然後對該欄位建立 FULLTEXT 類型的索引。(可參考官方文件 [1] 的說明)
使用時可以使用 MATCH (...) AGAINST (...) 敘述來進行全文檢索。
MATCH (...) 裡面指定的是要做全文檢索的欄位名稱,AGAINST (...) 裡面則是指定要搜尋的關鍵句。
它回應的會是一個數字,表示的是欄位內容跟關鍵句的相似度,如果完全不相似就會回傳 0。

全文檢索的敘述的應用的方法,基本上是放在 WHERE 後面
例如下面這個敘述會在 table_name 這個資料表當中去對 message 欄位做全文檢索,搜尋 'admin' 這個句子:
SELECT * FROM table_name WHERE MATCH (message) AGAINST ('admin');
不過也可以放在 SELECT 後面,秀出來可以自己看一下結果是不是如同自己預期的
例如改成下面這樣,檢索結果的相似度就會列在後面,相似度越高的排在越前面:
SELECT *, MATCH (message) AGAINST ('admin') AS re FROM table_name ORDER BY re DESC;

另外全文檢索可以使用三種模式做檢索:
  • BOOLEAN MODE
  • NATURAL LANGUAGE SEARCH
  • NATURAL LANGUAGE SEARCH WITH QUERY EXPANSION(簡稱為 WITH QUERY EXPANSION
詳情建議參考 [1-3] 的說明。預設如果沒有指定的話,會使用 NATURAL LANGUAGE SEARCH 模式
也就是會引入 stopword 的效應,即某些在自然語言中太常出現的字會自動被濾掉,不會被用來做全文檢索。
三種的差異嘛.....目前我還沒有太深刻的體會 XD
但目前根據測試,假設我的資料中有一些包含 ".... administrator ...." 和 ".... admin ...." 兩種句子
如果用 'admin' 去做全文檢索的話,在 BOOLEAN MODENATURAL LANGUAGE SEARCH 中都找不到任何包含 administrator 的資料
只有用 WITH QUERY EXPANSION 才能找到。
但根據官方文件的描述,WITH QUERY EXPANSION 是做了兩次全文檢索
也就是先做一次 NATURAL LANGUAGE SEARCH
然後好像是把搜尋出來最高度相關的關鍵字們再拿來做第二次全文檢索,最後把第二次檢索結果回傳。

要切換檢索模式,只要在 AGAINST 後面加東西即可
例如要使用 BOOLEAN MODE,敘述就改成這樣:
MATCH (message) AGAINST ('admin' IN BOOLEAN MODE)
要用 NATURAL LANGUAGE SEARCH WITH QUERY EXPANSION 則是改成:
MATCH (message) AGAINST ('admin' WITH QUERY EXPANSION)

參考資料:
FULL TEXT SEARCH
1、MySQL:12.9. Full-Text Search Functions
2、MySQL:12.9.2. Boolean Full-Text Searches
3、MySQL:12.9.3. Full-Text Searches with Query Expansion
4、MySQL 全文搜索 FULLTEXT match
5、MySQL Fulltext Search 使用方式
6、Mysql全文搜索match…against的用法
7、Mysql全文搜索match against的用法

沒有留言: