談mySQL數(shù)據(jù)庫(kù)的UTF8中文網(wǎng)站全文檢索的實(shí)現(xiàn)_PHP教程
推薦:揭秘PHP開(kāi)發(fā)搜索引擎技術(shù)全過(guò)程談到網(wǎng)頁(yè)搜索引擎時(shí),很多人都會(huì)想到雅虎。的確,雅虎開(kāi)創(chuàng)了一個(gè)互聯(lián)網(wǎng)絡(luò)的搜索時(shí)代。然而,雅虎目前用于搜索網(wǎng)頁(yè)的技術(shù)卻并非該公司原先自己開(kāi)發(fā)的。2000年8月,雅虎采用了Google這家由斯坦福大學(xué)學(xué)生創(chuàng)建的公司的技術(shù)。理由非常簡(jiǎn)單,Google的搜索引擎比雅
現(xiàn)在的互聯(lián)網(wǎng)上,很多網(wǎng)站都提供了全文搜索功能,瀏覽者可以通過(guò)輸入關(guān)鍵字或者是短語(yǔ)來(lái)搜索特定的資料。在PHP MySQL構(gòu)架的網(wǎng)站中,通常的做法是通過(guò)SELECT查詢的Like語(yǔ)句來(lái)進(jìn)行搜索,這一辦法存在搜索不夠精確、以及效率非常低下的缺點(diǎn)。比如對(duì)一個(gè)有十幾萬(wàn)條記錄數(shù)據(jù)表的TEXT字段進(jìn)行LIKE操作,可能會(huì)花費(fèi)上近10秒鐘左右,這對(duì)網(wǎng)站的瀏覽者來(lái)說(shuō)是一個(gè)非常糟糕的使用體驗(yàn)。如何在海量的數(shù)據(jù)中能夠快速的進(jìn)行全文檢索呢?MySQL提供了一個(gè)全文索引功能,也就是把字段設(shè)置上FULLTEXT索引屬性,然后通過(guò)SELECT的MATCH AGAINST語(yǔ)句進(jìn)行查找。
我們開(kāi)發(fā)的一個(gè)純英文站點(diǎn)TouchUs - The Global Yellow Pages & Business Directory(www.touchus.org)就是利用MySQL的這一功能,實(shí)現(xiàn)了對(duì)十多萬(wàn)條數(shù)據(jù)的平均全文檢索時(shí)間小于0.5秒。但是在開(kāi)發(fā)TouchUs的中文網(wǎng)站——城市黃頁(yè)網(wǎng)時(shí)(www.city39.cn),碰到了新的問(wèn)題。原來(lái)英文排版時(shí)詞和詞之間是通過(guò)空格區(qū)分的,F(xiàn)ULLText可以完全支持,但是對(duì)中文或者是東亞文字就沒(méi)有這么簡(jiǎn)單了,因?yàn)橹形牡脑~和詞之間并沒(méi)有明顯的分隔,所以MySQL不支持中文字符的全文檢索。
如何讓MySQL也能支持中文的全文檢索呢?偶然間產(chǎn)生了一個(gè)思路,那就是能不能在中文分詞后,通過(guò)對(duì)中文進(jìn)行編碼轉(zhuǎn)化成英文字符,這樣就在中英文間建立一個(gè)特定的聯(lián)系,然后再進(jìn)行全文檢索,這樣不就實(shí)現(xiàn)了中文的全文索引了嗎?經(jīng)過(guò)試驗(yàn),答案是肯定的。下面是在城市黃頁(yè)網(wǎng)中實(shí)現(xiàn)的具體過(guò)程:
1. 建立一個(gè)單獨(dú)的索引表,比如對(duì)應(yīng)members表,我們建立一個(gè)members_index表。
用戶信息表(members) 用戶信息全文索引表(members_index)
User_id user_id
User_name index_intro
User_introduction
在members_index表的index_intro中加入fulltext索引。
2. 對(duì)用戶信息表(members)的User_introduction字段內(nèi)容進(jìn)行中文分詞處理
中文分詞的處理過(guò)程,可以參考簡(jiǎn)易中文分詞系統(tǒng)http://www.ftphp.com/scws/,在城市黃頁(yè)網(wǎng)中,我們采用了scws的PHP擴(kuò)展模塊方式來(lái)實(shí)現(xiàn)中文分詞。scws的php擴(kuò)展模塊安裝非常簡(jiǎn)單,只需簡(jiǎn)單編譯配置后即可使用。在具體的php代碼中,我們寫(xiě)了如下的函數(shù)來(lái)實(shí)現(xiàn)分詞后將分詞結(jié)果用空格進(jìn)行連接。
//中文分詞函數(shù)
function str_fc($str) {
$so = scws_new();
$so->set_charset('utf8');
// 這里沒(méi)有調(diào)用 set_dict 和 set_rule 系統(tǒng)會(huì)自動(dò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. 對(duì)分詞結(jié)果進(jìn)行編碼,可以采用多種編碼方式,比如base64編碼、urlencode編碼、漢字轉(zhuǎn)拼音等,對(duì)gb2312甚至可以采用區(qū)位碼編碼方式。考慮到存儲(chǔ)空間以及便利性,我們采用了PHP的urlencode編碼方式。需要注意的是,在編碼前,我們可以去掉重復(fù)的分詞來(lái)節(jié)約存儲(chǔ)空間,編碼后要去掉編碼結(jié)果中的%符號(hào),因?yàn)閡rlencode采用RFC 1738進(jìn)行編碼,會(huì)產(chǎn)生很多%,而%在MySQL是通配符。下面是編碼過(guò)程用到的PHP代碼
| $data = str_fc($data); //中文分詞 $data = array_filter(explode(" ",$data)); //刪除數(shù)組空項(xiàng) $data = array_flip(array_flip($data)); //刪除重復(fù)項(xiàng) //對(duì)分詞結(jié)果進(jìn)行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. 在進(jìn)行搜索處理時(shí),首先對(duì)用戶輸入的關(guān)鍵字進(jìn)行同樣的分詞編碼處理,然后通過(guò)MySQL的SELECT的MATCH AGAINST語(yǔ)句進(jìn)行全文快速檢索,根據(jù)檢索結(jié)的user_id即可調(diào)用用戶信息表(members)中的原始數(shù)據(jù)進(jìn)行顯示,而沒(méi)有必要進(jìn)行一次解碼重組。
分享:解讀二十五個(gè)頂級(jí)PHP模板引擎整理為了找到一個(gè)好的模板引擎,我在互聯(lián)網(wǎng)上進(jìn)行搜索,目前已經(jīng)整理出了以下名單: Smarty Smarty的特點(diǎn)是將模板編譯成PHP腳本,然后執(zhí)行這些腳本。很快,非常靈活。 Heyes Template Class 一個(gè)非常容易使用,但功能強(qiáng)大并且快速的模板引擎,它幫助你把頁(yè)面布局
- PHPNOW安裝Memcached擴(kuò)展方法詳解
- php記錄頁(yè)面代碼執(zhí)行時(shí)間
- PHP中獎(jiǎng)概率的抽獎(jiǎng)算法程序代碼
- apache設(shè)置靜態(tài)文件緩存方法介紹
- php對(duì)圖像的各種處理函數(shù)代碼小結(jié)
- PHP 關(guān)于訪問(wèn)控制的和運(yùn)算符優(yōu)先級(jí)介紹
- 關(guān)于PHP語(yǔ)言構(gòu)造器介紹
- php/js獲取客戶端mac地址的實(shí)現(xiàn)代碼
- php5.5新數(shù)組函數(shù)array_column使用
- PHP preg_match的匹配多國(guó)語(yǔ)言的技巧
- php 中序列化和json使用介紹
- php采集文章中的圖片獲取替換到本地
PHP教程Rss訂閱編程教程搜索
PHP教程推薦
- Apache中RewriteCond規(guī)則參數(shù)的詳細(xì)介紹
- 讓你的PHP引擎全速運(yùn)轉(zhuǎn)的三個(gè)簡(jiǎn)單絕招
- Extjs4 Treegrid 使用心得分享(經(jīng)驗(yàn)篇)
- PHP與C#的值類型指向區(qū)別
- php如何實(shí)現(xiàn)遠(yuǎn)程網(wǎng)絡(luò)文件下載到服務(wù)器
- PHP插入排序?qū)崿F(xiàn)代碼
- 深入PHP操作MongoDB的技術(shù)總結(jié)
- 任何使用PHP與XML進(jìn)行網(wǎng)站編程
- PHP中最容易忘記的一些知識(shí)點(diǎn)總結(jié)
- Mysql中分頁(yè)查詢的兩個(gè)解決方法比較
- 相關(guān)鏈接:
復(fù)制本頁(yè)鏈接| 搜索談mySQL數(shù)據(jù)庫(kù)的UTF8中文網(wǎng)站全文檢索的實(shí)現(xiàn)
- 教程說(shuō)明:
PHP教程-談mySQL數(shù)據(jù)庫(kù)的UTF8中文網(wǎng)站全文檢索的實(shí)現(xiàn)
。