MySQL全文檢索中文搜尋

2021-06-04 02:52:15 字數 3466 閱讀 4269

全文檢索概述:

檢索基本過程:

全文檢索大體分兩個過程,索引建立(indexing)和搜尋索引(search)。

• 索引建立:將需要被搜尋的資料提取資訊,建立索引的過程。

• 搜尋索引:就是得到使用者的查詢請求,搜尋建立的索引,然後返回結果的過程。

全文檢索的索引建立過程一般有以下幾步:

1:準備待索引的原資料

2:將原資料傳給分詞元件。

分詞元件會做以下幾件事情:

1. 將文件分成乙個乙個單獨的單詞。

2. 去除標點符號。

3. 去除停詞(stop word)。

經過分詞(tokenizer)後得到的結果稱為詞元(token)。

3:將得到的詞元(token)傳給語言處理元件(linguistic processor)。

對於英語,語言處理元件一般做以下幾點:

1. 變為小寫(lowercase)。

2. 將單詞縮減為詞根形式,如「cars」到「car」等。這種操作稱為:stemming。

3. 將單詞轉變為詞根形式,如「drove」到「drive」等。這種操作稱為:lemmatization。

語言處理元件的結果稱為詞(term)。

4:將得到的詞(term)傳給索引元件(indexer)。

索引元件(indexer)主要做以下幾件事情:

1. 利用得到的詞(term)建立乙個字典。

2. 對字典按字母順序進行排序。

3. 合併相同的詞(term)成為文件倒排(posting list)鍊錶。

簡單的中文分詞演算法:

簡單的中文分詞演算法知識,一般採用n元分詞法對中文詞句進行拆分。基本過程是,對於中文文件,首先過濾標點符號,將其替換成空格,然後對空格之間的每一段詞句依次拆分,每個詞元為n個字,然後合併相同的詞元,並對詞元進行排序。

一元分詞法:

例句:

上有天堂,下有蘇杭!
根據上面的過程,首先我們將標點符號替換為空格,則句子轉化為:

上有天堂 下有蘇杭
然後對於一元分詞,乙個字就是乙個詞元,句子拆分為:

上 有 天 堂 下 有 蘇 杭
最後合併相同的詞元,得到結果如下:

上 有 天 堂 下 蘇 杭

二元分詞法:

同樣的對於上面的句子,第一步是相同的,對於二元分詞,兩個字作為乙個詞元,依次拆分為:

上有 有天 天堂 下有 有蘇 蘇杭
最後合併相同詞元,得到分詞結果:

上有 有天 天堂 下有 有蘇 蘇杭
搜尋結果排序:

按照匹配相似度排序,相似度最高的排在最前面,以此降序排列。

mysql全文檢索過程介紹:

mysql從4.0版本開始支援全文檢索,但是只是對英文支援全文索引。對於中文全文檢索,首先我們需要將中文轉變為mysql眼中的英文,然後它才能以英文分詞演算法去對句子進行正確的分詞處理,以便建立起全文索引。

例如對於上面的結果:

上有 有天 天堂 下有 有蘇 蘇杭
這樣的分詞結果已經符合mysql眼中的「英文」書寫格式,但是mysql中的ft_min_word_len這個引數的預設值為4,也就是4個字母以上長度的單詞,才會被考慮,小於4個的,將會被忽略。我們需要修改這個長度,這樣才能搜尋到像天堂、蘇杭等這樣的短詞語,比如將其設定成2,但是這樣做有乙個缺點,它也會檢索到一些像php,hp等過於短小的英文詞語,從而出現很多無意義的搜尋結果。

還有另外一種方法來避開這個問題,那就是把中文轉變為另外一種語言,比如md5,分詞結果轉變為:

上有 有天 天堂 下有 有蘇 蘇杭 => 4ab801a555e6ff20e33cdd4e585c474e 8c59fda62e9e91995c40561ae6da83ad e69ee86290f7dd5d96c93546dfa5f83e 

985462310c8c259f4dfddda070a5181d 7937ff7349ba8c433c3eb088c853c6f6 16c6a7b45e0b49bbb9be1a820316715b

這樣做,使得中文大於了預設的2個字元,同時避免了中文詞語的歧義性。

md5之後的索引確實可以解決上面的問題,但是md5的字串太長了,占用空間太大,解決這個問題,我們可以用區位碼來表示中文詞元,乙個四位的十進位制數可以表示乙個漢字,那麼上面的分詞結果可以轉變為:

上有 有天 天堂 下有 有蘇 蘇杭 => 41475148 51484476 44764435 47345148 51484353 43532628

這樣表示漢字詞元,既使每個詞元長度大於ft_min_word_len的預設長度2,同時又縮短了長度,不至於占用很大的儲存空間,我們可以將分詞結果儲存於索引表中以備查詢之用。

具體例子:

表結構:article

title        varchar 200 -------- 用於存放標題 (顯示用)

search   text              -------- 用於存放標題分詞結果 (檢索用)

為字段search建立fulltext 索引

首先我們在將標題儲存到資料庫的時候,就已經將標題分詞並轉為區位碼,儲存到search欄位中,以用於全文索引。

經過分詞轉區位碼操作,結果為:

蘇杭  人間的天堂 => 43532628 40432868 28682136 21364476 44764435
然後進行全文檢索查詢:

select title, match(search) against('43532628 40432868 28682136 21364476 44764435' in boolean mode) 

as score from la_search

where match(search) against('43532628 40432868 28682136 21364476 44764435' in boolean mode)

order by score desc

limit 0,5

這裡將score作為相似度,按照相似度進行降序排列,相似度最高的顯示在最前面。

最後在實際使用中,我們需要提取score大於1的資料,並且結果會將標題也計入結果集中,需要將其過濾輸出。

中文二元分詞方法及區位碼轉換**:

mysql全文索引中文搜尋

由於mysql的預設配置是索引的詞的長度是4,所以需要修改mysql的配置檔案my.cnf 在 mysqld 位置內加入 ft min word len 2 其它屬性還有 ft wordlist charset gbk ft wordlist file home mysql wordlist gbk...

MySql5 7 全文索引(針對中文搜尋)

關於中文的全文檢索,寫的算是比較完整的,但是具體實現的時候,會有一些問題要解決。mysql語句 這裡的搜尋,使用的是sql語句,不支援hql。如果使用hibernate實體控制的話,需要做些修改 createquery createsqlquery 返回的實體,在還需增加.addentity cla...

mysql中文全文搜尋

centos6 xampp1.7.7 mysql5.5 opt lampp bin mysql uroot ppassword mysql show variables like plugin dir 外掛程式路徑 opt lampp lib mysql plugin wget tar zxvf m...