IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機版|論壇轉(zhuǎn)貼|軟件發(fā)布

您當前所在位置:首頁網(wǎng)絡(luò)編程PHP編程 → 基于MySQL數(shù)據(jù)庫的UTF8中文網(wǎng)站全文檢索的實現(xiàn)

基于MySQL數(shù)據(jù)庫的UTF8中文網(wǎng)站全文檢索的實現(xiàn)

時間:2015/6/28來源:IT貓撲網(wǎng)作者:網(wǎng)管聯(lián)盟我要評論(0)

現(xiàn)在的互聯(lián)網(wǎng)上,很多網(wǎng)站都提供了全文搜索功能,瀏覽者可以通過輸入關(guān)鍵字或者是短語來搜索特定的資料。在php+mysql構(gòu)架的網(wǎng)站中,通常的做法是通過SELECT查詢的Like語句來進行搜索,這一辦法存在搜索不夠精確、以及效率非常低下的缺點。比如對一個有十幾萬條記錄數(shù)據(jù)表的TEXT字段進行LIKE操作,可能會花費上近10秒鐘左右,這對網(wǎng)站的瀏覽者來說是一個非常糟糕的使用體驗。如何在海量的數(shù)據(jù)中能夠快速的進行全文檢索呢?MySQL提供了一個全文索引功能,也就是把字段設(shè)置上FULLTEXT索引屬性,然后通過SELECT的MATCH AGAINST語句進行查找。

我們開發(fā)的一個純英文站點TouchUs - The Global Yellow Pages & Business Directory(www.touchus.org)就是利用MySQL的這一功能,實現(xiàn)了對十多萬條數(shù)據(jù)的平均全文檢索時間小于0.5秒。但是在開發(fā)TouchUs的中文網(wǎng)站——城市黃頁網(wǎng)時(www.city39.cn),碰到了新的問題。原來英文排版時詞和詞之間是通過空格區(qū)分的,F(xiàn)ULLText可以完全支持,但是對中文或者是東亞文字就沒有這么簡單了,因為中文的詞和詞之間并沒有明顯的分隔,所以MySQL不支持中文字符的全文檢索。

如何讓MySQL也能支持中文的全文檢索呢?偶然間產(chǎn)生了一個思路,那就是能不能在中文分詞后,通過對中文進行編碼轉(zhuǎn)化成英文字符,這樣就在中英文間建立一個特定的聯(lián)系,然后再進行全文檢索,這樣不就實現(xiàn)了中文的全文索引了嗎?經(jīng)過試驗,答案是肯定的。下面是在城市黃頁網(wǎng)中實現(xiàn)的具體過程:

1. 建立一個單獨的索引表,比如對應members表,我們建立一個members_index表。

用戶信息表(members)  用戶信息全文索引表(members_index)
User_id    user_id
User_name   index_intro
User_introduction
 在members_index表的index_intro中加入fulltext索引。

2. 對用戶信息表(members)的User_introduction字段內(nèi)容進行中文分詞處理

中文分詞的處理過程,可以參考簡易中文分詞系統(tǒng)https://www.ftphp.com/scws/,在城市黃頁網(wǎng)中,我們采用了scws的PHP擴展模塊方式來實現(xiàn)中文分詞。scws的php擴展模塊安裝非常簡單,只需簡單編譯配置后即可使用。在具體的php代碼中,我們寫了如下的函數(shù)來實現(xiàn)分詞后將分詞結(jié)果用空格進行連接。

//中文分詞函數(shù)
function str_fc($str) {
 $so = scws_new();
 $so->set_charset('utf8');
 // 這里沒有調(diào)用 set_dict 和 set_rule 系統(tǒng)會自動試調(diào)用 ini 中指定路徑下的詞典和規(guī)則文件
 $so->send_text($str);
 while ($tmp = $so->get_result())
 {
  foreach (  $tmp as $ss ){
   $s = trim($ss[word]);
   if ( $s )
    $mystr .= trim($ss[word]) . " ";
    //echo urlencode(trim($ss[word])) . " ";
  }
 }
 return $mystr;
}
該函數(shù)返回就是用空格連接的分詞結(jié)果。

3. 對分詞結(jié)果進行編碼,可以采用多種編碼方式,比如base64編碼、urlencode編碼、漢字轉(zhuǎn)拼音等,對gb2312甚至可以采用區(qū)位碼編碼方式?紤]到存儲空間以及便利性,我們采用了PHP的urlencode編碼方式。需要注意的是,在編碼前,我們可以去掉重復的分詞來節(jié)約存儲空間,編碼后要去掉編碼結(jié)果中的%符號,因為urlencode采用RFC 1738進行編碼,會產(chǎn)生很多%,而%在MySQL是通配符。下面是編碼過程用到的PHP代碼

$data = str_fc($data);  //中文分詞
 $data = array_filter(explode(" ",$data)); //刪除數(shù)組空項
 $data = array_flip(array_flip($data));  //刪除重復項
 
 //對分詞結(jié)果進行urlcode編碼
 foreach (  $data as $ss ) {
  if (strlen($ss)>1 )
  $data_code .= str_replace("%","",urlencode($ss)) . " ";
 }
這里的$data_code就是編碼后的結(jié)果。把編碼結(jié)果根據(jù)user_id存入用戶信息全文索
引表(members_index)

4. 在進行搜索處理時,首先對用戶輸入的關(guān)鍵字進行同樣的分詞編碼處理,然后通過MySQL的SELECT的MATCH  AGAINST語句進行全文快速檢索,根據(jù)檢索結(jié)的user_id即可調(diào)用用戶信息表(members)中的原始數(shù)據(jù)進行顯示,而沒有必要進行一次解碼重組。

以上MySQL UTF8中文全文檢索方法,目前在我們的2個中文網(wǎng)站——城市黃頁網(wǎng)(www.city39.cn)和企業(yè)供求信息網(wǎng)(www.myglobalmarket.cn)中運行良好,平均檢索時間均小于0.5秒。

關(guān)鍵詞標簽:全文檢索,中文,MySQL

相關(guān)閱讀

文章評論
發(fā)表評論

熱門文章 plsql developer怎么連接數(shù)據(jù)庫-plsql deveplsql developer怎么連接數(shù)據(jù)庫-plsql deve2021年最好用的10款php開發(fā)工具推薦2021年最好用的10款php開發(fā)工具推薦在 PHP 中使用命令行工具在 PHP 中使用命令行工具php應用程序安全防范技術(shù)研究php應用程序安全防范技術(shù)研究

相關(guān)下載

人氣排行 詳解ucenter原理及第三方應用程序整合思路、方法PHP中防止SQL注入攻擊PHP會話Session的具體使用方法解析PHP運行出現(xiàn)Notice : Use of undefined constant 的解決辦法CakePHP程序員必須知道的21條技巧PHP如何清空mySQL數(shù)據(jù)庫PHP采集圖片實例(PHP采集)plsql developer怎么連接數(shù)據(jù)庫-plsql developer連接數(shù)據(jù)庫方法