13

アプリケーションに検索機能を追加するために、 django-haystack チュートリアルを理解しようとしています。残念ながら、検索インデックスの作成に関しては、いくつかの重要な部分がよくわかりません。

チュートリアルでは、次の django モデルが例として機能します。

class Note(models.Model):
    user = models.ForeignKey(User)
    pub_date = models.DateTimeField()
    title = models.CharField(max_length=200)
    body = models.TextField()

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

最後に、次のようなデータ テンプレートを作成するよう求められます。

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

チュートリアル全体を読んだ後でも、現在インデックスが作成されているものについてまだ混乱しています。私が理解している限り、フィールドの内容はauthorインデックスpub_dateの作成に使用されます。このフィールドtextは、いくつかの設定を提供するためのものです。また、データ テンプレートは、後で検索結果を表示する方法、つまり、モデルのどのフィールドを検索結果に表示するかを指定します。

これは正しいですか、それとも完全に間違っていますか? 私の意見では、チュートリアルとドキュメントは多くの面でかなりあいまいです。事前にどうもありがとうございました。

4

2 に答える 2

18

そうです、チュートリアルは少しあいまいに見えますが、これが私がそれを理解する方法です。モデルのインスタンスごとにNote、Haystack はそのインスタンスを使用してデータ テンプレートをレンダリングし、レンダリングされたテンプレートにインデックスを付けます。レンダリングされたテンプレートは、インスタンスの「ドキュメント」です。チュートリアルでは、「これにより、(エラーが発生しやすい連結ではなく) データ テンプレートを使用して、検索エンジンが検索に使用するドキュメントを作成できます。」そのため、titleフィールドを検索可能にしたい場合は{{ object.title }}、データ テンプレートにのみ含めます。

そのため、モデル内の他のフィールドは、NoteIndex検索クエリの結果をフィルター処理するために使用されます。インデックス モデルが次のようになっている場合:

class NoteIndex(indexes.SearchIndex, indexes.Indexable):
  text = indexes.CharField(document=True, use_template=True)

「ドキュメント テキストに表示される、昨年発行されたノートをすべて教えてください」という検索クエリを発行することはできません。にフィールドとしてfoo含める場合(チュートリアルで行うように)、次のようなクエリを作成できます。pub_dateNoteIndex

recent_results = SearchQuerySet().filter(content='foo').order_by('-pub_date')[:5]

これは、単語 を含む最近公開された 5 つのドキュメントを要求しますfoo。モデルに含めずpub_dateに、自分でクエリを実行して結果をフィルター処理することもできると思いますが、フィルター処理するフィールドについてインデックス作成時に Haystack に伝えると、はるかに効率的なクエリになると思います。NoteIndexcontent='foo'

検索結果の表示方法については、別のテンプレートを使用して指定します。チュートリアルで示されている最も基本的な Haystack の使用法では、検索結果を表示するためのテンプレートは search/search.html にあります: http://django-haystack.readthedocs.org/en/latest/tutorial.html#search-テンプレート 検索結果を反復処理して、モデル インスタンス ( ) の任意のフィールドを出力result.objectできます。

于 2012-12-19T20:04:01.220 に答える
2

クラス定義では、

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

Haystack はuser、データベースの属性のインデックスを として格納しauthor、データベース フィールドのインデックスを indexとしてpub_date格納します。pub_date

テンプレートには、「検索可能な」フィールドのみが含まれています。たとえば、機密データを検索インデックスに保存し、テンプレートで指定しないことで検索から非表示にすることができます。

textフリーテキスト検索と考えることができます

于 2012-12-19T20:06:33.453 に答える