Haystack是django的開源全文搜索框架(全文檢索不一樣於特定字段的模糊查詢,使用全文檢索的效率更高 ),該框架支持Solr,Elasticsearch,Whoosh, **Xapian搜索引擎它是一個可插拔的後端(很像Django的數據庫層),因此幾乎你全部寫的代碼均可以在不一樣搜索引擎之間便捷切換html
pip install django-haystack
###添加Haystack到INSTALLED_APPS
git
跟大多數Django的應用同樣,你應該在你的設置文件(一般是settings.py
)添加Haystack到INSTALLED_APPS
. 示例: github
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', # 添加 'haystack', # 你的app 'blog', ]
###修改settings.py
數據庫
在你的settings.py
中,你須要添加一個設置來指示站點配置文件正在使用的後端,以及其它的後端設置。 HAYSTACK——CONNECTIONS
是必需的設置,而且應該至少是如下的一種: django
HAYSTACK_CONNECTIONS = { 'default': { 'ENGINE': 'haystack.backends.solr_backend.SolrEngine', 'URL': 'http://127.0.0.1:8983/solr' # ...or for multicore... # 'URL': 'http://127.0.0.1:8983/solr/mysite', }, }
HAYSTACK_CONNECTIONS = { 'default': { 'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine', 'URL': 'http://127.0.0.1:9200/', 'INDEX_NAME': 'haystack', }, }
#須要設置PATH到你的Whoosh索引的文件系統位置 import os HAYSTACK_CONNECTIONS = { 'default': { 'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine', 'PATH': os.path.join(os.path.dirname(__file__), 'whoosh_index'), }, }
#首先安裝Xapian後端(http://github.com/notanumber/xapian-haystack/tree/master) #須要設置PATH到你的Xapian索引的文件系統位置。 import os HAYSTACK_CONNECTIONS = { 'default': { 'ENGINE': 'xapian_backend.XapianEngine', 'PATH': os.path.join(os.path.dirname(__file__), 'xapian_index'), }, }
SearchIndexes
SearchIndexes
對象是Haystack決定那些數據應該放入索引和處理流數據的方式。你能夠把它們看做是Django的Models
或Forms
,它們是基於字段和數據操做/存儲的。後端
你一般爲你指望索引的每個Model
都建立一個惟一的SearchIndex
。雖然你能夠在不一樣的model中重複使用相同的SearchIndex
,只要你當心的作而且字段名很規範。api
爲了創建SearchIndex
,全部的都是indexes.SearchIndex
和indexe.Indexable
的子類。定義要存儲數據的字段,定義get_model
方法。session
咱們會在下面建立和Note
模型對應的NoteIndex
。這個代碼一般在search_indexes.py
中。儘管這不是必須的。這使得Haystack能自動的檢測到它。NoteIndex
應該看起來像:app
import datetime from haystack import indexes from myapp.models import Note class NoteIndex(indexes.SearchIndex, indexes.Indexable): text = indexes.CharField(document=True, use_template=True) author = indexes.CharField(model_attr='user') pub_date = indexes.DateTimeField(model_attr='pub_date') def get_model(self): return Note def index_queryset(self, using=None): """Used when the entire index for model is updated.""" return self.get_model().objects.filter(pub_date__lte=datetime.datetime.now())
每一個SerachIndex
須要有一個(僅有一個)一個字段document=True
.這個指示着Haystack和搜索引擎把那個字段做爲主要的檢索。 框架
當你選擇document=True字段時,它應該在你的SearchIndex類裏面始終如一,以免後端的混淆。一個便捷的命名是text。 在全部的樣例中這個text字段名並無什麼特殊。它也能夠是其餘任何命名,你能夠叫它pink_polka_dot也是沒有關係的。只是簡單便利的交作text。
另外,咱們在text
字段上提供了use_template=True
。這容許咱們使用一個數據模板(而不是容易出錯的級聯)來構建文檔搜索引擎索引。你應該在模板目錄下創建新的模板search/indexes/myapp/note_text.txt
,並將下面內容放在裏面。
{{ object.title }} {{ object.user.get_full_name }} {{ object.body }}
此外,咱們增長了其餘字段(author
和pub_date
)。當咱們提供額外的過濾選項的時候這是頗有用的。來至Haystack的多個SearchField
類能處理大多數的數據。
一個常見的主題是容許管理員用戶在將來添加內容,而不立刻在網站展現,直到將來某個時間點。咱們特別自定義了index_queryset
方法來防止將來的這些項添加到索引。
SearchView
到你的URLconf
在你的URLconf
中添加下面一行:
(r'^search/', include('haystack.urls')),
這會拉取Haystack的默認URLconf,它由單獨指向SearchView
實例的URLconf組成。你能夠經過傳遞幾個關鍵參數或者徹底從新它來改變這個類的行爲。
你的搜索模板(默認在search/search.html
)將可能很是簡單。下面的足夠讓你的搜索運行(你的template/block
應該會不一樣)
{% extends 'base.html' %} {% block content %} <h2>Search</h2> <form method="get" action="."> <table> {{ form.as_table }} <tr> <td> </td> <td> <input type="submit" value="Search"> </td> </tr> </table> {% if query %} <h3>Results</h3> {% for result in page.object_list %} <p> <a href="{{ result.object.get_absolute_url }}">{{ result.object.title }}</a> </p> {% empty %} <p>No results found.</p> {% endfor %} {% if page.has_previous or page.has_next %} <div> {% if page.has_previous %}<a href="?q={{ query }}&page={{ page.previous_page_number }}">{% endif %}« Previous{% if page.has_previous %}</a>{% endif %} | {% if page.has_next %}<a href="?q={{ query }}&page={{ page.next_page_number }}">{% endif %}Next »{% if page.has_next %}</a>{% endif %} </div> {% endif %} {% else %} {# Show some example queries to run, maybe query syntax, something else? #} {% endif %} </form> {% endblock %}
須要注意的是page.object_list
其實是SearchResult
對象的列表。這些對象返回索引的全部數據。它們能夠經過{{result.object}}
來訪問。因此{{ result.object.title}}
實際使用的是數據庫中Note
對象來訪問title
字段的。
這是最後一步,如今你已經配置好了全部的事情,是時候把數據庫中的數據放入索引了。Haystack附帶的一個命令行管理工具使它變得很容易。
簡單的運行./manage.py rebuild_index
。你會獲得有多少模型進行了處理並放進索引的統計。