【问题标题】:Taggit and Haystack with RealtimeSignalProcessorTaggit 和 Haystack 与 RealtimeSignalProcessor
【发布时间】:2014-01-14 04:50:03
【问题描述】:

请注意,我使用 elasticsearch 作为后端。

使用 django 设置,与我的模型 ObjectA 关联的 Taggit 标记似乎没有出现在我的索引中

HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'

当我使用

列出索引文档时
http://localhost:9200/_search

并查看我在数据库中插入的 ObjectA 实例的索引记录,“标签”元素显示为

"tags": []

只有在我运行之后

manage.py rebuild_index [or update_index]

标签是否出现,即

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

有趣的是 'title'、'description' 会自动显示而无需运行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 的情况下让标签显示在索引文档中的任何建议?

【问题讨论】:

    标签: elasticsearch django-haystack django-taggit


    【解决方案1】:

    不确定您是否已经知道这一点,但您的索引在保存后不包含标签的原因是当信号处理器处理索引更新时它们尚未存储。解决此问题的一种巧妙方法是扩展 haystack.signals.RealtimeSignalProcessor 以触发相关模型的更新。这是一个可以更新任何标记模型的索引的示例。

    signals.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'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-12
      • 1970-01-01
      • 1970-01-01
      • 2017-08-25
      • 2020-10-25
      • 1970-01-01
      相关资源
      最近更新 更多