2012-12-19 8 views
12

私はアプリケーションに検索機能を追加するために、django-haystack tutorialの周りに頭を抱えようとしています。残念ながら、私は検索インデックスを構築する際に重要な部分をあまり理解していません。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 }} 

readiの後に次のようなデータテンプレートを作成するように求められました。チュートリアル全体では、私はまだ索引付けされているものについてはまだ混乱しています。私が理解する限り、フィールドauthorpub_dateの内容は、インデックスの作成に使用されます。フィールドtextは、単にいくつかの設定を提供するためのものです。そして、データテンプレートは、後に検索結果を表示する方法、すなわち、検索結果に表示するために使用するモデルのフィールドを指定する。

これが正しいのですか、まったく間違っていますか?私の意見では、チュートリアルとドキュメンテーションは非常に曖昧です。事前にどうもありがとうございました。

+2

男は、あなたが正確に入力されたとして、フリーテキスト検索と考えることができます! – GreenAsJade

+2

男、あなたは私がここに来た正確な質問を、4年後にタイプしました! @GreenAsJade Man、2年後に私がここに来た正確なコメントをタイプしました!しかし、私にはさらに何かがあります。ドキュメンテーションは実際にはごみ全体です。 –

答えて

16

あなたが正しいですが、チュートリアルはやや曖昧ですが、ここで私はそれを理解しています。 Noteモデルの各インスタンスについて、Haystackは、そのインスタンスを使用してデータテンプレートをレンダリングし、レンダリングされたテンプレートを索引付けします。レンダリングされたテンプレートは、インスタンスの「ドキュメント」です。このチュートリアルでは、「これにより、検索エンジンが検索に使用するドキュメントを構築する際に、エラーの起こりやすい連結ではなくデータテンプレートを使用することができます。したがって、titleフィールドのみを検索可能にしたい場合は、{{ object.title }}をデータテンプレートに含めるだけです。

NoteIndexモデルの他のフィールドは、検索クエリの結果をフィルタリングするために使用されます。あなたのインデックスモデルがちょうどこのように見えた場合:

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

あなたはすべてのNotes fooは、文書のテキストで表示され、昨年に掲載された私を与える」、と言う検索クエリを発行することはできないであろう。 "あなたはNoteIndex内のフィールドとしてpub_dateを(彼らはチュートリアルでそうであるように)含まれている場合、あなたは次のようなクエリを行うことができます。

単語を含む5最近発表されたドキュメントを要求
recent_results = SearchQuerySet().filter(content='foo').order_by('-pub_date')[:5] 

foo 。私はをNoteIndexモデルに含めることなく、content='foo'を照会して結果をフィルタリングすることができますが、フィルタリングしたいフィールドについて索引付けしてHaystackに伝えれば、はるかに効率的なクエリだと思いますに。

検索結果の表示方法は、別のテンプレートを使用して指定します。チュートリアルで示す最も基本的なHaystackの使用法では、検索結果を表示するためのテンプレートはsearch/search.htmlにあります。http://django-haystack.readthedocs.org/en/latest/tutorial.html#search-template 検索結果を繰り返し、モデルインスタンスのどのフィールド(result.object)あなたが望むでしょう。あなたのクラス定義で

+1

ありがとう、エミリー、あなたはそれをとてもうまく説明しました。 :)私が理解していなかった1つの重要な点は、 'text'フィールドがフルテキスト検索を行うのに十分であり、他のフィールドは検索結果をさらにフィルタリングするためだけであるということでした。チュートリアルは、* document *の定義が検索のコンテキストで何を意味するのか分からないため、より明確に書かれている可能性があります。しかし、今私はそれが私には明らかだと思う。ヴィーレン・ダンク! :) – pemistahl

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

ヘイスタックは、テンプレートのみ」を含むインデックス

pub_dateようuserauthorなど、データベースの属性、およびデータベースフィールドpub_dateのインデックスのインデックスを保存します検索可能な "フィールドに表示されます。たとえば、重要なデータを検索インデックスに保存する場合、テンプレート内で指定しないで検索から非表示にすることができます。

textは、正確な質問は、私が2年後に、入力するためにここに来た

+0

ああ、検索可能なフィールドは、インデックスを付ける必要のあるフィールドを指定することで既に定義されていると思っていました。しかし、索引元は検索可能な項目と異なる場合があります。これは私が理解できなかったものだと思う。ありがとうございました! :) – pemistahl

関連する問題