Django的全文檢索 頂 原

我們曾經愉快的使用Haystack+Whoosh作爲全文檢索引擎,可伴隨着數據的增加,我們毫無意外的遇到了性能問題。檢索時間從毫秒級一下子跌入秒級,常常一個檢所需要數秒鐘才能返回。而且一旦我們要對索引內容進行調整,而不得不全部重建索引,只能等待數個小時才能建好。

爲了解決這個問題,我們考察了衆多的方案,並最終決定使用xapain替換Whoosh。

考察過的方案/產品包括:

  • ElasticSearch 非常流行的全文搜索引擎方案。結合Kibbna、Logstash,不但可以實現我們想要的高性能全文檢索功能,還能集中採集化日誌處理,數據挖掘、分析等。這些也是我們非常想要的功能。放棄原因是,我們的團隊規模尚小,且技術領域主要集中於Python和前端。引入ElasticSearch需要很多Java(運維)相關的技能,雖說不是完全陌生,對我們來說也是引入了較高的複雜度。
  • SphinxSearch 看了很多資料。據說性能不錯,但是內存佔用極大。可靠性不是特別高。
  • Xapain 性能出衆,索引數據庫小。不支持中文分詞,可集成Jieba等第三方分詞庫。不支持多進程同時寫入。

爲此我們在xapain-haystack基礎上,做了一些改進。增加中文分詞,以及串行寫入問題。

https://github.com/yuanxu/xapian-haystack

安裝和配置

xapian-haystack提供了一個腳本,可以快速安裝xapain以及Python-bindings。不過此腳本要求必須使用virtualenv環境。如果未使用請自行修改腳本。

source <path>/bin/activate
./install_xapian.sh 1.4.5

在settings.py中增加如下內容。

HAYSTACK_CONNECTIONS = {
    'default': {
        'ENGINE': 'extension.backends.haystack.xapian_backend.XapianEngine',
        'PATH': os.path.join(BASE_DIR, 'xapian_index'),
    },
}
HAYSTACK_SIGNAL_PROCESSOR = 'extension.backends.haystack.queued_signal.QueuedSignalProcessor'

添加中文支持

我們在Xapain-Haystack基礎上,爲其增加了中文支持,並改進數值型多關鍵字檢索。

實時更新緩存

Xapain支持一寫多讀,不支持多個進程同時寫入。只能使用Haystack提供的 manage.py rebuild_index週期性的更新索引庫,這就造成數據的不一致性。 而我們有一個場景是將全文檢索庫,作爲數據搜索的來源。有一定的時效性要求。 爲此,我們藉助redis的鎖機制,以及Celery實現了串行化索引處理功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章