Haystack

Haystack

一 、什麼是Haystack

undefined

Haystackdjango的開源全文搜索框架(全文檢索不一樣於特定字段的模糊查詢,使用全文檢索的效率更高 ),該框架支持SolrElasticsearchWhooshXapian搜索引擎它是一個可插拔的後端(很像Django的數據庫層),因此幾乎你全部寫的代碼均可以在不一樣搜索引擎之間便捷切換html

二 、安裝

pip install django-haystack

三 、配置

3.1 添加Haystack到INSTALLED_APPS

跟大多數Django的應用同樣,你應該在你的設置文件(一般是settings.py)添加Haystack到INSTALLED_APPS. 示例:python

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',

    # 添加
    'haystack',

    # 你的app
    'blog',
]

3.2 修改settings.py

在你的settings.py中,你須要添加一個設置來指示站點配置文件正在使用的後端,以及其它的後端設置。 HAYSTACK——CONNECTIONS是必需的設置,而且應該至少是如下的一種:git

3.2.1 Solr示例

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',
    },
}

3.2.2 Elasticsearch示例

HAYSTACK_CONNECTIONS = {
    'default': {
        'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
        'URL': 'http://127.0.0.1:9200/',
        'INDEX_NAME': 'haystack',
    },
}

3.2.3 Whoosh示例

#須要設置PATH到你的Whoosh索引的文件系統位置
import os
HAYSTACK_CONNECTIONS = {
    'default': {
        'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine',
        'PATH': os.path.join(os.path.dirname(__file__), 'whoosh_index'),
    },
}

3.2.4 Xapian示例

#首先安裝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'),
    },
}

undefined

四 、處理數據

4.1 建立SearchIndexes

SearchIndexes對象是Haystack決定那些數據應該放入索引和處理流數據的方式。你能夠把它們看做是DjangoModelsForms,它們是基於字段和數據操做/存儲的。github

你一般爲你指望索引的每個Model都建立一個惟一的SearchIndex。雖然你能夠在不一樣的model中重複使用相同的SearchIndex,只要你當心的作而且字段名很規範。數據庫

爲了創建SearchIndex,全部的都是indexes.SearchIndexindexe.Indexable的子類。定義要存儲數據的字段,定義get_model方法 。django

咱們會在下面建立和Note模型對應的NoteIndex。這個代碼一般在search_indexes.py中。儘管這不是必須的。這使得Haystack能自動的檢測到它。NoteIndex應該看起來像:後端

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和搜索引擎把那個字段做爲主要的檢索。api

當你選擇document=True字段時,它應該在你的SearchIndex類裏面始終如一,以免後端的混淆。一個便捷的命名是text。
在全部的樣例中這個text字段名並無什麼特殊。它也能夠是其餘任何命名,你能夠叫它pink_polka_dot也是沒有關係的。只是簡單便利的交作text。

另外,咱們在text字段上提供了use_template=True。這容許咱們使用一個數據模板(而不是容易出錯的級聯)來構建文檔搜索引擎索引。你應該在模板目錄下創建新的模板search/indexes/myapp/note_text.txt,並將下面內容放在裏面。session

{{ object.title }}
{{ object.user.get_full_name }}
{{ object.body }}

此外,咱們增長了其餘字段(authorpub_date)。當咱們提供額外的過濾選項的時候這是頗有用的。來至Haystack的多個SearchField類能處理大多數的數據。app

一個常見的主題是容許管理員用戶在將來添加內容,而不立刻在網站展現,直到將來某個時間點。咱們特別自定義了index_queryset方法來防止將來的這些項添加到索引。

undefined

五 、設置視圖

5.1 添加SearchView到你的URLconf

在你的URLconf中添加下面一行:

(r'^search/', include('haystack.urls')),

這會拉取Haystack的默認URLconf,它由單獨指向SearchView實例的URLconf組成。你能夠經過傳遞幾個關鍵參數或者徹底從新它來改變這個類的行爲。

5.2 搜索模板

undefined

你的搜索模板(默認在search/search.html)將可能很是簡單。下面的足夠讓你的搜索運行(你的template/block應該會不一樣)

{% extends 'base.html' %}

{% block content %}
   <h2>Search</h2>

   <form method="get" action=".">
       <table>
           {{ form.as_table }}
           <tr>
               <td>&nbsp;</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 }}&amp;page={{ page.previous_page_number }}">{% endif %}&laquo; Previous{% if page.has_previous %}</a>{% endif %}
                   |
                   {% if page.has_next %}<a href="?q={{ query }}&amp;page={{ page.next_page_number }}">{% endif %}Next &raquo;{% 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字段的。

5.3 重建索引

這是最後一步,如今你已經配置好了全部的事情,是時候把數據庫中的數據放入索引了。Haystack附帶的一個命令行管理工具使它變得很容易。

簡單的運行./manage.py rebuild_index。你會獲得有多少模型進行了處理並放進索引的統計。

undefined

相關文章
相關標籤/搜索