資源描述:
《通過MySQL全文搜索實(shí)現(xiàn)中文的相關(guān)搜索.doc》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、通過MySQL內(nèi)置全文檢索實(shí)現(xiàn)中文的相關(guān)檢索關(guān)鍵字:MySQL全文檢索全文索引中文分詞二元分詞區(qū)位碼相似度注:本文使用的MySQL版本為:MySQL4.0.x在MySQL4中,是已經(jīng)開始支持全文檢索(索引)的了。但是只是對(duì)英文支持全文檢索。由于英文在書寫上的特殊性,使得分詞算法相對(duì)中文來說,簡(jiǎn)單得多。一般來說,我們可以通過單詞與單詞之間的空格,以及標(biāo)點(diǎn)符號(hào)來完成這個(gè)分詞過程。但是就中文來說,就沒有那么簡(jiǎn)單。MySQL無法對(duì)中文做出正確的分詞,假設(shè)有如下英文句子:"Helloworld!HelloP
2、HP!"通過上面提及的方法,可以很簡(jiǎn)單的把這個(gè)句子分詞為:1Hello2world3PHP我們?cè)賮砜纯粗形牡木渥樱?你好世界,你好PHP!"按照英文的算法,分詞如下:1你好世界2你好PHP顯然是不能滿足我們的需要的。所以,首先我們要做的是,把中文的句子轉(zhuǎn)變?yōu)镸ySQL眼中的英文,以便使得它能以英文分詞算法去對(duì)句子進(jìn)行正確的分詞處理。先將上面中文句子進(jìn)行標(biāo)點(diǎn)過濾處理,得到以下句子:你好世界你好PHP接著再使用中文分詞中較簡(jiǎn)單實(shí)現(xiàn)的二元分詞算法對(duì)句子進(jìn)行二元分詞,得到以下句子:你好好世世界你好PHP因
3、為把標(biāo)點(diǎn)符號(hào)替換為空格,以及PHP本身為英文字母的關(guān)系,可以不用進(jìn)行二元切分,所以得到上面句子。這個(gè)時(shí)候,我們來看看處理過后的句子,會(huì)發(fā)現(xiàn),就其書寫格式上來說,已經(jīng)符合英文的書寫格式,既以空格,標(biāo)點(diǎn)來對(duì)單詞形成自然間隔。只是上面句子沒有標(biāo)點(diǎn),只有空格而已。到此,我們已經(jīng)成功的將中文“翻譯”為MySQL能理解的“英文”書寫格式。但是,問題還沒解決,首先,MySQL中,ft_min_word_len(分詞詞匯最小長(zhǎng)度)這個(gè)參數(shù)的默認(rèn)值為4,也就是4個(gè)字母以上長(zhǎng)度的單詞,才會(huì)被考慮,小于4個(gè)的,將會(huì)被忽
4、略。如果不改變這個(gè)長(zhǎng)度,按照上面的分詞結(jié)果,我們將無法通過你好,世界,PHP等檢索到相關(guān)的結(jié)果,因?yàn)榉殖鰜淼脑~太短了,不在MySQL的選擇范圍內(nèi)。我們可以通過修改ft_min_word_len的值,將其設(shè)置為2來解決上面問題,但是這樣做的話,在檢索列表中的原本就為英文的短小詞匯,如:PHP,MP3,也會(huì)被劃入檢索范圍內(nèi),這樣做的結(jié)果是,出現(xiàn)很多無意義的相關(guān)結(jié)果。請(qǐng)看以下列表:[MP3]thelook[MP3]becauseofyou因?yàn)樗麄兌纪蠱P3在標(biāo)題中,所以會(huì)出現(xiàn)上述提到的問題?;氐絝t_
5、min_word_len值的問題,我們之所以要修改他,是為了能讓MySQL找到我們的二元分詞,但是短小的英文又被“無辜”的卷入,我們目前要解決的問題就是,如何使得MySQL能檢索到二個(gè)字的中文詞匯,又能忽略掉原本的英數(shù)?第一個(gè)反應(yīng)是把中文MD5,這樣以上分詞就將轉(zhuǎn)化為以下結(jié)果:你好好世世界你好PHP=>b94ae3c6d892b29cf48d9bea819b27b9f5625345be46432fb0fd51340fcf66799067de5206278a93823f9c5dc2c737fdb94
6、ae3c6d892b29cf48d9bea819b27b9PHP這樣做,首先是使得中文分詞的長(zhǎng)度超越了默認(rèn)的2個(gè)字,同時(shí)消除了中文的歧義性。(MySQL4對(duì)中文的處理有問題),搜索“車輪”時(shí)候,不再會(huì)出現(xiàn)類似“發(fā)動(dòng)機(jī)”結(jié)果的問題。(車輪的例子只是為了方便理解而做出的假設(shè))通過上面的做法,已經(jīng)解決了分詞最小長(zhǎng)度的問題,順利的把中文詞匯長(zhǎng)度升級(jí),從而達(dá)到把中文詞匯劃入檢索范圍,把較短的英數(shù)劃出檢索范圍。休息一下,然后發(fā)現(xiàn)這個(gè)MD5后的字符串是否太長(zhǎng)了點(diǎn)……比較占用空間,要不,于是想到區(qū)位碼,4位數(shù)的區(qū)
7、位碼能表示一個(gè)GB漢字,一個(gè)詞有二個(gè)漢字組成,轉(zhuǎn)換為區(qū)位碼后是8個(gè)數(shù)字。不但能確定惟一性,也就MD5而已減少了長(zhǎng)度。下面是轉(zhuǎn)換后的:你好好世世界你好PHP=>b94ae3c6d892b29cf48d9bea819b27b9f5625345be46432fb0fd51340fcf66799067de5206278a93823f9c5dc2c737fdb94ae3c6d892b29cf48d9bea819b27b9PHP=>36672635263542324232297136672635PHP呵呵,是
8、不是比MD5的小了很多呢?最后我們把相同的詞匯留一個(gè),多余的刪除。得到366726352635423242322971PHP于是就完成了"你好世界,你好PHP!"到"366726352635423242322971PHP"的轉(zhuǎn)換。通過上面方法結(jié)合MySQL全文檢索語句,我們可以通過給出一個(gè)標(biāo)題例如:"邁克爾·杰克遜-《危險(xiǎn)之旅之布加勒斯特站》"找出類似以下的相關(guān)標(biāo)題邁克爾杰克遜-《邁克爾杰克遜危險(xiǎn)布加勒斯特演唱會(huì)》MichaelJackson-《邁克爾杰克遜羅馬尼亞危險(xiǎn)演唱會(huì)》邁克