Django本身不提供全文檢索的功能,但django-haystack為其提供了全文檢索的框架。 django-haystack能為Django提供whoosh,solr,Xapian和Elasticsearc四種全文檢索引擎作為后端。 其中whoosh為純python的實現,不是非常大型的應用,是沒有問題的。 本文將介紹Django1.9中通過django-haystack與whoosh集成以及whoosh的中文支持。
安裝依賴:
pip install django-haystack |
建立模型
我們以文章為搜索目標,現在我的app名字為blog, 模型文件是mysite/blog/models.py :
1 |
# coding=utf-8 |
search_indexes.py
在app目錄下建立一個search_indexes.py(mysite/blog/search_indexes.py)代碼如下:
1 |
#!/usr/bin/env python |
備注:search_indexes.py文件名不能修改,否則報錯:No fields were found in any search_indexes.
post_text.txt
因為在search_indexes.py使用了use_template=True,所以可以同時使用模板對索引字段進行定義。
如:mysite/blog/templates/search/indexes/blog/post_text.txt
:
{{ object.title }} |
settings.py
1 |
# Application definition |
urls.py
1 |
urlpatterns = patterns( |
jieba中文分詞
jieba其實已經提供了集成whoosh的ChineseAnalyzer, 也就是說不需要自己寫ChineseAnalyzer了,直接在whoosh_backend.py中直接引用就好; 同時,不推薦將whoosh_backend.py放到Lib下面,這樣移植性會有問題,自己的代碼,還是放在項目下面為妙。
1. 將文件haystack.backends.whoosh_backend.py拷貝到app下面,並重命名為whoosh_cn_backend.py, 如blog/whoosh_cn_backend.py。重點的改造有:
-
增加:
1
from jieba.analyse import ChineseAnalyzer
-
修改
1
schema_fields[field_class.index_fieldname] = TEXT(stored=True, analyzer=ChineseAnalyzer(), field_boost=field_class.boost, sortable=True)
2. 修改后端引擎,setting.py配置:
1 |
# full text search |
重建索引
1 |
python manage.py rebuild_index |
索引更新
最簡單的辦法就是在settings.py中添加:
1 |
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor' |
自定義搜索示例
(1) 先定義view:
1 |
from haystack.forms import SearchForm |
(2) 然后在template頁面中:
1 |
<!-- searchbox START --> |