PHP下MySQL UTF8中文全文檢索的實現

2021-05-28 11:37:05 字數 2233 閱讀 2854

現在的

網際網路上,很多**都提供了全文搜尋功能,瀏覽者可以通過輸入關鍵字或者是短語來搜尋特定的資料。在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欄位內容進行中文分詞處理

中文分詞的處理過程,可以參考簡易中文分詞

系統在城市黃頁網中,我們採用了scws的php擴充套件模組方式來實現中文分詞。scws的php擴充套件模組安裝非常簡單,只需簡單編譯配置後即可使用。在具體的php**中,我們寫了如下的函式來實現分詞後將分詞結果用空格進行連線。

//中文分詞函式

function str_fc($str)

}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 )

這裡的$data_code就是編碼後的結果。把編碼結果根據user_id存入使用者資訊全文索

引表(members_index)

4. 在進行搜尋處理時,首先對使用者輸入的關鍵字進行同樣的分詞編碼處理,然後通過

mysql的select的match  against語句進行全文快速檢索,根據檢索結的

user_id即可呼叫使用者資訊表(members)中的原始資料進行顯示,而沒有必要進行一

次解碼重組。

以上mysql utf8中文全文檢索方法,目前在我們的2個中文**——城市黃頁網(

www.city39.cn)和企業供求資訊網(

www.myglobalmarket.cn)中執行良好,平均檢索時間均小於0.5秒。

MySQL UTF8 中文亂碼處理

mysql安裝好後預設字符集不是utf8,因此顯示中文會有問題。在mysql可以執行 show variables like character 檢視當前字符集使用的編碼方式,如 以mysql 5.5版為例,在mysql安裝目錄下的my.ini 增加 mysql default character ...

perl 解決mysql utf8中文亂碼 問題

perl 解決mysql utf8中文亂碼 問題。mysql utf8 中文問題 zabbix root sbin cat a1.pl use dbi my dbuser devops my user root my passwd kjk123123 my dbh dbi connect dbi m...

8 中文亂碼問題

1.在 jsp 頁面上輸入中文,請求頁面後不出現亂碼 保證 contenttype text html charset utf 8 pageencoding utf 8 charset 和 pageencoding 的編碼一致,且都支援中文.通常建議取值為utf 8 還需保證瀏覽器的顯示的字元編碼也...