Django haystackは全文検索コードの例を実現します。


一、使う道具
haystackはdjangoのオープンソース検索フレームであり、このフレームはSolr、Elasticsearch、Whosh、*Xappian*サーチエンジンをサポートしており、コードを変更せずにエンジンを直接切り替えて、コード量を減らす。
検索エンジンはWhoshを使用しています。これは純粋なPythonによって実現された全文検索エンジンです。バイナリファイルなどがないので、比較的小さいです。配置は簡単です。もちろん性能はやや低いです。
中国語の分詞はJiebaです。Whoshは英語の分詞を持っていますので、中国語の分詞サポートはあまり良くないです。だから、Whoshの分詞のセットをjiebaに置き換えます。
その他:Python 3.4.4、Django 1.8.3、Debian 4.2.6_3
二、配置説明
今はプロジェクトをProjectといいます。myapのアプリがあります。簡単なディレクトリ構造は以下の通りです。
-プロジェクト
-プロジェクト
-settings.py
-ブログ
-models.py
このmodels.pyの内容は以下の通りであると仮定します。

from django.db import models
from django.contrib.auth.models import User
class Note(models.Model):
  user = models.ForeignKey(User)
  pub_date = models.DateTimeField()
  title = models.CharField(max_length=200)
  body = models.TextField()

  def __str__(self):
    return self.title
1.まず各ツールをインストールする
pinstall whosh django-haystack jieba
2.HaystackをDjangoのINSTALLEDに追加します。APPS
Djangoプロジェクトのセットアップs.pyの中のINSTALLED_APPSにHaystackを追加しました。例:

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

     # Added. haystack   ,
     'haystack', 
     # Then your usual apps...    app   haystakc  
     'blog',
]
英語の原版を見ます。
3.エンジンを設定するために、あなたのsettings.pyを修正します。
本教程はWhoshを使用していますので、以下のように構成されています。

import os
HAYSTACK_CONNECTIONS = {
  'default': {
    'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine',
    'PATH': os.path.join(os.path.dirname(__file__), 'whoosh_index'),
  },
}
名前の通り、ENGINEは使うエンジンが必要です。エンジンがWhoshなら、PATHはWhoshインデックスファイルの保存フォルダとして記入しなければなりません。
他のエンジンの構成は公式文書を参照してください。
4.索引の作成
あるアプリ、例えばmanappに対して全文検索をしたいなら、manappのディレクトリの下にsearchを作成しなければなりません。indexes.pyファイルのファイル名は変更できません。内容は以下の通りです

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())
各インデックスの中には必ずあります。一つのフィールドしかないのはdocument=Trueです。これはhaystackと検索エンジンを表しています。このフィールドの内容を索引として検索します。他のフィールドは付属の属性だけで、検索データとして便利に呼び出すことができません。
注意:フィールドを使用してdocument=Trueを設定すると、このフィールドの名前はtextとして約束されています。これはSearch Index類の中で一貫して命名されています。バックグラウンドの混乱を防ぐために、もちろん名前は勝手に変えられますが、変更は勧められません。
そして、haystackはuse_を提供しました。template=Trueはtextフィールドで、データテンプレートを使って検索エンジンインデックスのファイルを作成することができます。便利です。(公式の推奨はもちろん、他の複雑なインデックスファイルを作成する方法もあります。まだ分かりません。)データテンプレートのパスはyourap/templates/search/indexes/yourap/noteです。text.txt、例えば本例はブログ/templates/search/indexes/blog/note_text.txtファイル名は索引の類名でなければなりません。text.txt、その内容は
{object.title}
{object.user.get_}フルウ.name
{object.body}
このデータテンプレートの役割はNote.title,Note.user.get_です。フルウ.name、Note.bodyの3つのフィールドはインデックスを確立して、検索する時この3つのフィールドに全文検索をしてマッチングします。
5.URL構成にSearch Viewを追加し、テンプレートを配置する
urls.pyには以下のurl情報が配置されています。もちろん、urlルートは自由に書いてもいいです。
(r'^search/',include('haystack.urls'))
実はhaystack.urlsの内容は、

from django.conf.urls import url
from haystack.views import SearchView

urlpatterns = [
  url(r'^$', SearchView(), name='haystack_search'),
]
Search View()ビュー関数でデフォルトで使用されているhtmlテンプレートは現在のappディレクトリであり、経路はmyapp/templates/search/search.である。
だから、ブログ/templates/search/下にsearch.ファイルを追加する必要があります。

{% 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 }}" rel="external nofollow" >{{ 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 }}" rel="external nofollow" >{% endif %}« Previous{% if page.has_previous %}</a>{% endif %}
          |
          {% if page.has_next %}<a href="?q={{ query }}&page={{ page.next_page_number }}" rel="external nofollow" >{% 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 %}
明らかに分ページを持っています。
6.最後のステップでインデックスファイルを再構築します。
python manage.py rebuild_を使用します。indexまたはudateを使用するindexコマンド。
はい、次のプロジェクトを実行して、このurlに入って検索してみます。
三、次にやるべきことは、jiebaを使って言葉を分ける第一歩です。
ファイルをwhosh_backend.py(このファイルのパスはpythonパス/lib/python 3.4/site-packages/haystack/backends/whosh_backend.py
)appの下にコピーして、whosh_と名前を変えます。cn_backend.py、例えばブログ/whosh_cn_backend.py。次のように修正します
from jieba.analse import Chinese Analyzerを追加します。
次のように修正します
schemafields[field_]class.index_fieldname==
TEXT(stored=True,analzer=Chinese Analyzer()
field_book=field_class.book)
第二のステップ
settings.pyでエンジンを修正しました。以下の通りです。

import os
HAYSTACK_CONNECTIONS = {
  'default': {
    'ENGINE': 'blog.whoosh_cn_backend.WhooshEngine',
    'PATH': os.path.join(BASE_DIR, 'whoosh_index'
  },
}
第三歩
インデックスを再構築して、中国語を検索してみましょう。
索引の自動更新
インデックスが自動的に更新されていない場合は、新しいデータがデータベースに追加されるたびに、手動でudate_を実行します。index命令は非科学的です。インデックスを自動的に更新する最も簡単な方法は、settings.pyに信号を追加します。
 ハYSTACK_SIGNAL_PROCESSOR=
「haystack.signals.RealtimeSignal Processor」
公式文書
この入門編を見たら、簡単な全文検索ができるようになりましたよね。もしカスタマイズしたいなら、どうすればいいですか?公式文書とgithubのソースコードを読むことを提案します。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。