Haystack

什麼是Haystack

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

安裝

pip install django-haystack

配置

###添加Haystack到INSTALLED_APPSgit

跟大多數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

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

Elasticsearch示例

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

Whoosh示例

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

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

處理數據

建立SearchIndexes

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

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

爲了創建SearchIndex,全部的都是indexes.SearchIndexindexe.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 }}

此外,咱們增長了其餘字段(authorpub_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。你會獲得有多少模型進行了處理並放進索引的統計。

相關文章
相關標籤/搜索