Django Haystack:模板和模型索引的职责

时间:2014-05-06 20:56:16

标签: django django-templates django-haystack

我已经浏览了文档,我甚至创建了一些搜索后端,但我仍然对这些事情在大海捞针中做了什么感到困惑。搜索结束后搜索你放入你的字段继承index.SearchIndex,indexes.Indexable的类,或者是后端搜索模板中的文本?有人可以向我解释这个吗?

在django haystack中,你将创建一个类来定义应该查询的字段(这就是我理解它的方式),如下所示:

class ProductIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    name = indexes.CharField(model_attr='title', boost=1.75)
    description = indexes.CharField(model_attr='description')
    short_description = indexes.CharField(model_attr='short_description')

    def get_model(self):
        return Product

    def index_queryset(self, using=None):
        """Used when the entire index for model is updated."""
        return self.get_model().objects.filter(active=True,
                                           published_at__lte=datetime.now())

您还将创建一个可以执行某项操作的模板txt - 我不确定是什么。我知道在搜索算法期间搜索后端将覆盖此模板。

{{ object.name }}
{{ object.description }}
{{ object.short_description }}
{% for related in object.related %}
    {{ related.name }}
    {{ related.description }}
{% endfor %}

{% for category in object.categories.all %}
    {% if category.active %}
        {{ category.name }}
    {% endif %}
{% endfor %}

正如您所看到的,模板有一些我的索引类没有的字段,但搜索后端会搜索这些字段。那么为什么甚至在索引中都有字段呢?索引类的卷和索引模板是什么?有人可以向我解释一下。

1 个答案:

答案 0 :(得分:7)

ProductIndex类是这里的主要内容。 Haystack将使用此配置根据您选择的索引字段以及以何种方式索引Product模型。您可以阅读更多相关信息here

您创建的模板将由此字段text = indexes.CharField(document=True, use_template=True)使用。在此模板中,我们包含模型或相关模型中的所有重要数据,为什么?因为如果您不想只在一个字段中查找,这用于对所有数据执行搜索查询。

# filtering on single field
qs = SearchQuerySet().models(Product).filter(name=query)

# filtering on multiple fields
qs = SearchQuerySet().models(Product).filter(name=query).filter(description=query)

# filtering on all data where ever there is a match
qs = SearchQuerySet().models(Product).filter(text=query)