萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> mysql全文搜索與中文全文搜索方法

mysql全文搜索與中文全文搜索方法

本文章先是給大家介紹利用mysql自帶的全文搜索功能來實現英文與中文全文搜索的對比,然後介紹了由google開發的一款支持中文全文搜索的插件,有需要的朋友可參考

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/

copyright © 萬盛學電腦網 all rights reserved