国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

談mySQL數據庫的UTF8中文網站全文檢索的實現

2024-07-24 12:43:07
字體:
來源:轉載
供稿:網友

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

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

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

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字段內容進行中文分詞處理

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

//中文分詞函數
function str_fc($str) {
$so = scws_new();
$so->set_charset('utf8');
// 這里沒有調用 set_dict 和 set_rule 系統會自動試調用 ini 中指定路徑下的詞典和規則文件
$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;
}
該函數返回就是用空格連接的分詞結果。

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

$data = str_fc($data); //中文分詞
$data = array_filter(explode(" ",$data)); //刪除數組空項
$data = array_flip(array_flip($data)); //刪除重復項

//對分詞結果進行urlcode編碼
foreach ( $data as $ss ) {
   if (strlen($ss)>1 )
   $data_code .= str_replace("%","",urlencode($ss)) . " ";
}
這里的$data_code就是編碼后的結果。把編碼結果根據user_id存入用戶信息全文索
引表(members_index)

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

 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 和林格尔县| 海晏县| 阳江市| 安图县| 镇沅| 龙里县| 亳州市| 石嘴山市| 黔江区| 赣州市| 勃利县| 新野县| 广安市| 大厂| 杂多县| 象山县| 霍州市| 微博| 新疆| 民丰县| 宁化县| 扎兰屯市| 同江市| 汝阳县| 瑞丽市| 平远县| 会宁县| 长宁区| 安吉县| 万全县| 新巴尔虎右旗| 武邑县| 论坛| 五家渠市| 平乡县| 桓台县| 思南县| 霸州市| 平果县| 巴青县| 小金县|