ruby下面中文分詞的搜尋如何進行?
目前開始考慮這個問題, 目標是使用ferret, ferret是lucene搜尋引擎的ruby版本, 憑藉一點lucene的經驗, 我個人是非常喜歡ferret的, 靠lucene強大的分詞,index,search功能, 可以做出很多有趣的功能, 但是ferret有兩個痛點
- 不支援中文分詞,而且整合第三方分詞對我來說較困難(沒有開發c的經驗,而且我知道的中文分詞演算法都是java版本)
- 有時候做索引會出錯,好象是段地址錯誤, 因為ferret是在前台index, 所以錯誤也是在前台fastcig進程中, 感覺很不爽
原來的想法
利用ferret 和lucene相容的特點, 單獨寫一個java 類庫, 定時對資源做索引,不過後來為了效率(index比lucene快), 新版本的ferret放棄了和lucene相容, 這個想法是不可行了
更新後的想法
利用mysql中文分詞外掛程式,這個東西倒是很好,但是偏偏只支援mysql4.0,和mysql 5.1 beta, 剛好不支援我目前用的mysql5.0.x 由於沒有現成版本可以用, 也只好放棄(這個外掛程式只能用來全文檢索搜尋, 不像ferret還有其他好玩的功能)
目前的想法:
- 在ferret中通過rjb調用 lucene的中文分詞然後再index
- 需要index的model都增加一個屬性indexed,建立或者更新的時候都把indexed設定為false
- 把java寫好的中外分詞通過rjb封裝為一個drb service,或者乾脆掛在resin上做http頁面調用
- 在後台,單獨的程式定時啟動把所有未index的記錄select出來(indexed=false), 然後逐一調用第二步開發的進行分詞,即是過程中出錯, 也不影響前台頁面, 這裡只改動ferret的ruby代碼.
- 如果可能, 搜尋程式通過遠程協議來對keyword分詞,然後再搜尋
缺點
這個方案看上去比較噁心.很像一件到處是補丁的衣服, 目前沒有時間慢慢去研究ferret中的c代碼. 只好通過java來繞圈子
在後台運行index的話, 就無法即時搜尋當前文章, 而是有一個延時, 不過我覺得這個好解決. 另外後台index 就算出錯了也不影響前台頁面, 大不了有些記錄搜尋不到而已
對keyword分詞會有速度影響, 不過影響應該很小