0

バックエンドとしてelasticsearchを使用していることに注意してください。

モデル ObjectA に関連付けられた Taggit タグが、django 設定を使用してインデックスに表示されないようです

HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'

を使用してインデックス ドキュメントを一覧表示すると、

http://localhost:9200/_search

DBに挿入したObjectAインスタンスのインデックスレコードを表示すると、「タグ」要素は次のように表示されます

"tags": []

それは私が走った後だけです

manage.py rebuild_index [or update_index]

タグは表示されますか

"tags": ["tag-a", "tag-b"]

興味深いのは、rebuild_index/update_index を実行しなくても、「タイトル」、「説明」が自動的に表示されることです。

objecta_text.txt

{{ object.title }}
{{ object.description }}
{% for tag in object.tags.all %} {{ tag.name }} {% endfor %}

search_indexes.py

class ObjectAIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    title = indexes.CharField(model_attr='title')
    description = indexes.CharField(model_attr='description', null=True)
    tags = indexes.MultiValueField()

    def get_model(self):
        return ObjectA

    def prepare_tags(self, obj):
     return [tag.name for tag in obj.tags.all()] 

rebuild_index を呼び出さずにタグをインデックス ドキュメントに表示する方法について何か提案はありますか?

4

1 に答える 1

1

すでにこれを把握しているかどうかはわかりませんが、保存後にインデックスにタグが含まれていない理由は、シグナル プロセッサがインデックスの更新を処理するときにタグがまだ保存されていないためです。これを解決するハックな方法の 1 つはhaystack.signals.RealtimeSignalProcessor、関連するモデルの更新時にトリガーするように拡張することです。タグ付けされたモデルのインデックスを更新する例を次に示します。

信号.py

from haystack.signals import RealtimeSignalProcessor


class RelatedRealtimeSignalProcessor(RealtimeSignalProcessor):
    """
    Extension to haystack's RealtimeSignalProcessor not only causing the
    search_index to update on saved model, but also for related effected models
    """

    def handle_save(self, sender, instance, **kwargs):
        super(RelatedRealtimeSignalProcessor, self).handle_save(
            sender,
            instance,
            **kwargs
        )
        self.handle_related(sender, instance)

    def handle_delete(self, sender, instance, **kwargs):
        super(RelatedRealtimeSignalProcessor, self).handle_delete(
            sender,
            instance,
            **kwargs
        )
        self.handle_related(sender, instance)

    def handle_related(self, sender, instance):
        for related in self.get_related_models(sender, instance):
            super(RelatedRealtimeSignalProcessor, self).handle_save(
                related['sender'],
                related['instance']
            )

    def get_related_models(self, sender, instance):
        from taggit.models import TaggedItem

        related = []
        if sender == TaggedItem:
            related.append({
                'sender': instance.content_object.__class__,
                'instance': instance.content_object
            })
        return related

PS。更新することを忘れないでくださいHAYSTACK_SIGNAL_PROCESSOR = '<app>.signals.RealtimeSignalProcessor'

于 2014-05-06T17:07:08.967 に答える