Django-Haystack:should_update似乎没有触发RealtimeSignalProcessor?

时间:2014-03-15 18:36:15

标签: python django elasticsearch django-haystack

我有一个模型,它有一个布尔字段,表明模型对象是否处于活动状态。我基本上希望Haystack忽略具有active = False的任何对象。这适用于完整的重新索引使用:

def index_queryset(self, using=None):
    return ExampleModel.objects.filter(active=True)

然而,当一个对象被更新并且索引被实时更新并且没有完全重新编制索引时,例如当将一个对象更改为非活动状态时,以下内容并不起作用,而且似乎是不必要的:

def should_update(self, instance):
    if instance.active:
        return True
    self.remove_object(instance)
    return False

我希望在将对象标记为非活动时从索引中删除该对象,但是在将对象更新为非活动状态时,它仍保留在影响构面计数等的索引中。我使用manage.py update_index检查并且should_update代码不是似乎要跑?

有关我正在使用haystack dev和elasticsearch最新稳定的信息。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

查看源代码,should_update()默认返回True,表示reindex。此外,remove_object()附加到类的删除后挂钩,这可能是因为您没有删除记录而未被调用的原因。

您应该能够通过稍微改变代码来触发索引删除:

def should_update(self, instance, **kwargs):
    if instance.active:
        return True
    else:
        self.remove_object(instance, **kwargs)
        return False

或反过来:

def should_update(self, instance, **kwargs):
    if not instance.active:
        self.remove_object(instance, **kwargs)
    return instance.active

另一种选择是创建一个CRON脚本:

import haystack
from yourapp.models import ExampleModel

for obj in ExampleModel.objects.filter(active=False):
    haystack.site.remove_object(obj)

Django中的post_save信号也可以使用它。

精细打印:我测试此代码的任何。根据问题中提供的信息,它是理论

答案 1 :(得分:1)

  1. 在您的app目录中创建signals.py文件
  2. 编辑signals.py:

    from haystack import signals
    from .models import Product
    from haystack.exceptions import NotHandled
    
    class ProductUpdateSignalProcessor(signals.RealtimeSignalProcessor):
    
        def handle_save(self, sender, instance, **kwargs):
            if isinstance(instance, Product):
                using_backends = self.connection_router.for_write(instance=instance)
                for using in using_backends:
                    try:
                        index = self.connections[using].get_unified_index().get_index(sender)
                        if instance.active:
                            index.update_object(instance, using=using)
                        else:
                            index.remove_object(instance, using=using)
                    except NotHandled:
                        print(NotHandled.message)
            else:
                super(ProductUpdateSignalProcessor, self).handle_save(sender, instance, **kwargs)
    
  3. 编辑settings.py:

    HAYSTACK_SIGNAL_PROCESSOR = 'products.signals.ProductUpdateSignalProcessor'