1

Django Haystack docs は言う

**Warning**
When you choose a document=True field, it should be consistently named across all of your SearchIndex classes to avoid confusing the backend. The convention is to name this field text.

There is nothing special about the text field name used in all of the examples. It could be anything; you could call it pink_polka_dot and it won’t matter. It’s simply a convention to call it text.

しかし、私はそれが何を意味するのか分かりません。これは彼らのモデル例です:

haystack から datetime をインポート 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())

私が引用したテキストは、MY モデルのメイン フィールドを参照し、それを「テキスト」と呼ぶべきだと言っていますか、それとも search_indexes.py で定義されたクラスに言及していますか?

search_indexes.py のクラスの場合、上記の例で関連付けられているフィールド名はどこですか? model_attr がありません!

text = indexes.CharField(document=True, use_template=True)

そして、私の実際のアプリ モデルの場合、多くのアプリを含むプロジェクトをリファクタリングして、メインのテキスト フィールドを「テキスト」と呼ぶにはどうすればよいでしょうか。

お知らせ下さい。ありがとう。

4

1 に答える 1

7

SearchIndex定義はモデル定義を反映する必要はありません。異なるモデルのデータを共通の検索ドキュメントにマップする必要があります。

  1. テキスト フィールドに一貫した名前を付ける必要があるのはなぜですか?
  2. マップ コンテンツはどのように調達されますか? model_attr(なぜキーワードがないのか)

Haystack のドキュメントでは、モデル フィールドに一貫した名前を付ける必要があるのではなく、定義SearchIndex全体でフィールドに一貫した名前を付ける必要があるとアドバイスしています。SearchIndex検索インデックスの定義とモデルの定義には大きな違いがあります。モデル フィールドと検索フィールドの間の 1 対 1 のマッピングについては、心配する必要はなく、おそらく気にする必要はありません。

モデルから離れて、最初に何を検索するかを考えてください。共通の検索ビューで複数の異なるモデルを検索しますか? 2 つのモデルがあるとします。

class Note(models.Model):
    title = models.CharField(max_length=40)
    body = models.TextField()

class Memo(models.Model):
    subject = models.CharField(max_length=50)
    content = models.TextField()
    author = models.ForeignKey(StaffMember)

モデルの主要なコンテンツと、コンテンツ オブジェクトのタイトルまたは名前 (名前、タイトル、件名など) のみを検索する単純な検索ビューを作成します。

悪い例を次に示します (これは行わないでください)。

class NoteIndex(indexes.SearchIndex, indexes.Indexable):
    body = indexes.CharField(document=True, use_template=True)
    title = indexes.CharField(model_attr='title')

    def get_model(self):
        return Note

class MemoIndex(indexes.SearchIndex, indexes.Indexable):
    content = indexes.CharField(document=True, use_template=True)
    subject = indexes.CharField(model_attr='subject')

    def get_model(self):
        return Memo

この悪い例では、各検索インデックスでプライマリ コンテンツ フィールドとコンテンツ名フィールド (タイトルまたは件名)が定義されています。でも今はどうやって検索するの?に基づいてコンテンツに対してクエリを実行すると、コンテンツが失われsubjectます。Noteまた、 に対してクエリを実行した場合も同様ですbody

より良い例(これを行う):

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

    def get_model(self):
        return Note

class MemoIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    title = indexes.CharField(model_attr='subject')

    def get_model(self):
        return Memo

フィールド名はモデルのフィールド名と必ずしも一致しないことに注意してください。SearchIndexフィールドがデータを取得するモデル属性を定義するだけです。

データベース内の行ではなく、検索エンジン内でドキュメントを検索するため、SeachIndex定義はデータベースのコンテンツ (1 つのテーブルまたは複数のクエリ) を検索ドキュメントにマップします。SearchIndex定義は変換であり、それぞれが指定したSearchFieldとおりにデータを変換します。

欠落している についてのあなたの質問に関してはmodel_attr、それはコンテンツを取り込む方法の 1 つにすぎません。テンプレートからテキスト コンテンツをレンダリングすることもできます。これは、text上記のフィールドが行うことです (これに関する SearchField API ドキュメントを参照してください)。model_attrソースは単純な文字フィールドに適しています。

于 2013-02-23T15:30:44.867 に答える