教學 關於星空中文搜尋的新思維做法與想法

本帖由 yoching2014-10-20 發佈。版面名稱:PHP

  1. yoching

    yoching 超神星 管理成員

    其實,該思維當初是在寫vbb中文搜尋時。早期的中文搜尋大多是用所謂的二分詞法。
    也就是將原本的「這是一本書」這一段話,將其拆解成「這是」「是一」「一本」「本書」的做法
    ,並將其化成word關鍵字的做法。借此來加快中文搜尋的索引速度。

    主因也是因為mysql並無法去針對中文字來做索引字詞的方式。變成我們需要使用手動的字詞分詞。
    也就產生了「二分詞」的做法。
    再早期,該方法的確加快了不少搜尋動作,也可以比較準確性的搜尋主題。

    但後期其實我在處理一些客戶。也就發生了一些問題存在。由其是大型的論壇上,這個問題就產生出來。
    首先就是索引的建立奇慢。我曾經就有過將一個客戶他的論壇。約將近8000萬的文章量。索引就需要花將近三天來建立。

    其二就是佔用的空間也非常的大。畢竟用二分詞的做法,也確實很容易產生不必要的關鍵字出來。這也很容易發生誤判。但因為大多數人比較沒感覺。也就不了了之。

    其三就是mysql的欄位容量限制。雖然該限制容量其實是很大的。約2mb。
    但是,我還是會碰上了。因為常用字的關係。該站台也不過才1000萬文章量,就有約10個關鍵字無法去記錄tids串。因為容量太大。該關鍵字有可能在1000萬篇文章就佔用了800萬。

    為此,我後來才想要研發新的中文搜尋方式。
     
  2. yoching

    yoching 超神星 管理成員

    於是經過三個月的努力。原先用三位元字詞的處理方式。但處理出來的效果非常的不好。有時還會找不到字。
    後來想用字典的模式處理。但時間久了當字詞量大的時候。反而會造成整度下降。

    在苦思不得其解的情況下。在國外發現了一篇文章。說明了mysql的全文索引的問題。因其字詞的切開只是很單純的用符號做處理切開。
    而中文字也不是不能搜尋,其實是可以搜尋的。只是.....他得要一整個連動才行。
    這為如文章是「這是一本書」,你只能用「這是一本書」不能用「一本書」「這是」

    因為在sql內的分詞就是會將中文字變成這樣。這才是中文搜尋的最大的問題。
    所以他的方式,就是將中文字依一個一個字切解分離。如「這是一本書」變成「這」「是」「一」「本」「書」
    然後再轉換成utf8字碼。(用英數儲存索引的效果是最好的)

    再利用全文索引的條件式來做處理就行了。

    於是,我花了將近4個多月的研究。總算開發出一個中文搜尋的初版出來了。
    目前在這個論壇上就是運用這個原理的寫法做搜尋的。

    當然在搜尋速度上,還是比不太過在mysql安裝的plus。
    但也相差不大。且效能消耗也不高。我已經有裝在1000萬文章的站台上試過。
    速度真的很不錯。
     

分享此頁面

正在載入...