mysql內建的功能。
MySQL全文檢索搜尋的文法
| 代碼如下 |
複製代碼 |
SELECT fields list FROM table WHERE MATCH ( col1 , col2 ,...) AGAINST ( expr [ search_modifier ]) search_modifier: { IN BOOLEAN MODE | WITH QUERY EXPANSION } |
例如:
| 代碼如下 |
複製代碼 |
| select * from articles where match(title, body) against(‘北京 奧運’)在欄位“title,body”上全文檢索搜尋“北京 奧運” |
注意,MySQL的全文檢索搜尋索引只能建立在Myisam引擎上。
首先用下面表舉例:
| 代碼如下 |
複製代碼 |
CREATE TABLE articles ( id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, title VARCHAR(200), body TEXT, FULLTEXT (title,body) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; |
MySQL使用Match()和Against()執行全文檢索搜尋,舉例如下:
| 代碼如下 |
複製代碼 |
SELECT body FROM articles WHERE Match(body) Against('www.111cn.net'); |
如上Match是正對指定的列進行搜尋,Against('www.phpddt.com')是正對指定詞進行搜尋
另外:
使用查詢擴充WITH QUERY EXPANSION,將會搜尋出更多結果(mysql會將匹配的行中有用的詞再次進行搜尋,這樣搜尋出來的結果更多,但可能不是你想要的);
使用布爾文本搜尋IN BOOLEAN MODE,類似我們平時使用seo/seo.html" target="_blank">搜尋引擎時用到的的文法:邏輯與、邏輯或、邏輯非等.支援的布爾操作符如下:
全文布爾操作符:
--------------------------------------------------------------------------------------------------------------
|操作符 | 說明 |
--------------------------------------------------------------------------------------------------------------
| + |包含,詞必須存在
| - |排除,詞必須不出現
| > |包含,而且增加等級值
| < |包含,且減少等級值
| () |把片語成子運算式(允許這些子運算式作為一個組被包含,排除,排列等)
| ~ |取消一個詞的排序值
| * |詞尾的萬用字元
| " " |定義一個短語(與單個詞的列表不一樣,它匹配整個短語以便包含或排除這個短語)
----------------------------------------------------------------------------------------------------------------
使用方法如下:
| 代碼如下 |
複製代碼 |
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('+apple -banana' IN BOOLEAN MODE); |
+ 表示AND,即必須包含。- 表示NOT,即不包含。
| 代碼如下 |
複製代碼 |
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('apple banana' IN BOOLEAN MODE); |
apple和banana之間是空格,空格表示OR,即至少包含apple、banana中的一個。
| 代碼如下 |
複製代碼 |
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('+apple banana' IN BOOLEAN MODE); |
必須包含apple,但是如果同時也包含banana則會獲得更高的權重。
| 代碼如下 |
複製代碼 |
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('+apple ~banana' IN BOOLEAN MODE); |
~ 是我們熟悉的異或運算子。返回的記錄必須包含apple,但是如果同時也包含banana會降低權重。但是它沒有 +apple -banana 嚴格,因為後者如果包含banana壓根就不返回。
| 代碼如下 |
複製代碼 |
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('+apple +(>banana <orange)' IN BOOLEAN MODE); |
返回同時包含apple和banana或者同時包含apple和orange的記錄。但是同時包含apple和banana的記錄的權重高於同時包含apple和orange的記錄。
MySQL對中文全文索引無法正確支援,下面再介紹一個外掛程式,利用mysqlcft 實現中文全文檢索搜尋。
Mysqlcft 是為 MySQL 5.1.22 ~ 5.1.25 RC 開發的中文全文索引外掛程式,用於解決MySQL無法正確支援中文全文檢索索引的問題
1、優點:
•精準度很高:採用自創的“三位元組交叉切分演算法”,對中文語句進行分割,無中文分詞詞庫,搜尋精準度遠比中文分詞演算法高,能達到LIKE '%...%"的準確率。
•查詢速度快:查詢速度比LIKE '%...%"搜尋快3~50倍,文章末尾有測試結果;
•標準外掛程式式:以MySQL 5.1全文索引的標準外掛程式形式開發,不修改MySQL原始碼,不影響MySQL的其他功能,可快速跟進MySQL新版本;
•支援版本多:支援所有的MySQL 5.1 Release Candidate版本,即MySQL 5.1.22 RC~最新的MySQL 5.1.25 RC;
•支援字元集:支援包括GBK、GB2312、UTF-8、Latin1、BIG5在內的MySQL字元集(其他字元集沒有測試過);
•系統相容好:具有i386和x86_64兩個版本,支援32位(i386)和64位(x86_64)CPU及Linux系統;
•適合分布式:非常適合MySQL Slave分布式系統架構,無詞庫維護成本,不存在詞庫同步問題。
2、缺點:
•mysqlcft中文全文索引只適用於MyISAM表,因為MySQL只支援對MyISAM表建立FULLTEXT索引;
•MySQL不能靜態編譯安裝,否則無法安裝mysqlcft外掛程式;
•基於“三位元組交叉切分演算法”的索引檔案會比海量、ft-hightman等基於“中文分詞演算法”的索引檔案稍大,但不是大很多。
根據我的測試,mysqlcft全文索引的.MYI索引檔案是.MYD資料檔案的2~6倍
外掛程式下載 https://code.google.com/p/mysqlcft/