使用update_index --remove从Haystack / Xapian索引中删除

时间:2011-08-10 10:38:24

标签: django django-haystack

我正在尝试使用./manage.py update_index --remove管理命令从搜索索引中删除结果。

我想删除这些对象,而不是删除它们时的对象:

enabled = models.BooleanField()

字段为False

我在这做什么?我还需要准备SearchIndex吗?

import datetime
from haystack.indexes import *
from haystack import site
from articles.models import Article

class ArticleIndex(SearchIndex):

    text = CharField(document=True, use_template=True)
    title = CharField(model_attr='title')
    content = CharField(model_attr='content')

    def get_queryset(self):
        """Used when the entire index for model is updated."""
        return Article.site_published_objects.filter(enabled=True)

    def get_updated_field(self):
        return 'modified'

    def remove_object(self):
        pass

site.register(Article, ArticleIndex)

谢谢。

1 个答案:

答案 0 :(得分:7)

我没有对此进行测试,但您可以通过将搜索索引模板包装在一个条件中来实现所需的效果,例如:

{# in search/indexes/yourapp/article_text.txt #}
{% if object.enabled %}
    {# ... whatever you have now #}
{% endif %}

当您运行./manage.py update_index时,带有enabled=False的文章最终会没有与之关联的数据,也不会显示在搜索结果中。

更新

查看SearchIndex的来源,有一个remove_object()方法从索引中删除对象。还运行should_update()来确定是否应该更新对象的索引。

也许可以使用以下内容触发索引删除:

class ArticleIndex(SearchIndex):
    # ...

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