萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> mysql中文全文搜索之學習筆記

mysql中文全文搜索之學習筆記

mysql中文全文搜索雖然說mysql支持了但是感覺很不精確,下面我來介紹一下我的mysql中全文搜索學習筆記,歡迎各位同學進入參考。

mysql中模糊搜索關鍵字可以用like關鍵字,它可以查詢出包涵關鍵字的字段,但當數據量變大時(比如超過百萬條),由於不能使用索引,全表掃描會導致性能很差。那怎麼能查詢出包涵關鍵字的內容呢?這時可以采用mysql的全文搜索。但有個前提:需要把進行全文搜索的字段添加fulltext索引,並且只能建立在Myisam引擎上。然後用如match(字段1[,字段2,字段3…]) against(‘關鍵字1 關鍵字2’)這樣的方式搜索,這樣可以查詢出某些字段中包涵某些關鍵字的信息。

另外,用like匹配的是字符,全文搜索匹配的是關鍵字。例如:“歡迎來到火星時代IT開發”,如果用like查詢這句話的任意連接著的字符比如 “歡迎來”、“IT開發”類似無意義的字符也可以查詢出相應的結果。而用全文搜索只能用一些有意義的詞來查詢才可以查詢到,比如“火星時代”、“開發”此類關鍵字才能查到。通常查詢比較短的內容,比如模糊查詢姓名,可以采用like;而從大段落內容查詢一些關鍵字,就要用全文搜索。

全文搜索中,如果搜索全英文的內容,因為英文每個單詞都用空格分開的,mysql可以通過空格找到包涵搜索關鍵字的一些記錄。但因為中文直接沒有像英文那樣有空格分開,mysql是無法搜索直接查詢到包涵搜索關鍵字的記錄的,這是需要寫入數據的時候就把記錄的內容用一個一個關鍵字用空格分開寫入,這樣mysql就可以搜索包涵中文的全文搜索了。例如:“歡迎來到火星時代IT開發”這句話,寫入數據庫時可以把每個關鍵字用空格分割寫入, 類似“歡迎 來到 火星時代 IT 開發”這樣的語句。

看到有一個scws這樣的中文分詞插件比較不錯,簡單的學習了一下。它包涵一些專有名稱、人名、地名、數字年代等規則集合,可以直接將語句按這些規則分開成一個一個關鍵詞,准確率在90%-95%之間。按照安裝說明把scws的擴展放入php的擴展目錄裡,下載規則文件和詞典文件,並在php配置文件中引用它們,就可以用scws進行分詞了。

下面是簡單的使用示例:

 

 代碼如下 復制代碼 <?php
//實例化分詞插件核心類
$so = scws_new();
//設置分詞時所用編碼
$so->set_charset(‘utf-8’);
//設置分詞所用詞典(此處使用utf8的詞典)
$so->set_dict('/path/dict.utf8.xdb');
//設置分詞所用規則
$so->set_rule('/path/rules.utf8.ini ');
//分詞前去掉標點符號
$so->set_ignore(true);
//是否復式分割,如“中國人”返回“中國+人+中國人”三個詞。
$so->set_multi(true);
//設定將文字自動以二字分詞法聚合
$so->set_duality(true);
//要進行分詞的語句
$so->send_text(“歡迎來到火星時代IT開發”);
//獲取分詞結果,如果提取高頻詞用get_tops方法
while ($tmp = $so->get_result())
{
  print_r($tmp);
}
$so->close();
?>

注:如以上例子,輸入的文字,詞典,規則文件這三者的字符集必須統一;另外mysql 4.XX有的是不支持中文全文搜索的,可以存入關鍵字對應的區位碼以方便全文搜索

MySQL全文檢索筆記
 
1. MySQL 4.x版本及以上版本提供了全文檢索支持,但是表的存儲引擎類型必須為MyISAM,
以下是建表SQL,注意其中顯式設置了存儲引擎類型
 

 代碼如下 復制代碼 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;
  www.111cn.net 

   其中FULLTEXT(title, body) 給title和body這兩列建立全文索引,之後檢索的時候注意必須同時指定這兩列。
 
2. 插入測試數據

 代碼如下 復制代碼  
INSERT INTO articles (title,body) VALUES
    ('MySQL Tutorial','DBMS stands for DataBase ...'),
    ('How To Use MySQL Well','After you went through a ...'),
    ('Optimizing MySQL','In this tutorial we will show ...'),
    ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
    ('MySQL vs. YourSQL','In the following database comparison ...'),
    ('MySQL Security','When configured properly, MySQL ...');

 
3. 全文檢索測試
 

 代碼如下 復制代碼 SELECT * FROM articles
    WHERE MATCH (title,body) AGAINST ('database');
 
   檢索結果如下:
5        MySQL vs. YourSQL        In the following database comparison ...
1        MySQL Tutorial               DBMS stands for DataBase ...

   說明全文匹配時忽略大小寫。
 
4. 可能遇到的困擾
 
到目前為止都很順利,但是如果檢索SQL改為下面會怎樣呢?

 代碼如下 復制代碼  
SELECT * FROM articles  www.111cn.net 
    WHERE MATCH (title,body) AGAINST ('well');

 
   結果讓人大跌眼鏡,開始我也困惑了許久,後來去網上查了下才知道原來是這麼回事:
 
mysql指定了最小字符長度,默認是4,必須要匹配大於4的才會有返回結果,可以用SHOW VARIABLES LIKE 'ft_min_word_len' 來查看指定的字符長度,也可以在mysql配置文件my.ini 更改最小字符長度,方法是在my.ini 增加一行 比如:ft_min_word_len = 2,改完後重啟mysql即可。

 

copyright © 萬盛學電腦網 all rights reserved