我已经浏览了文档,我甚至创建了一些搜索后端,但我仍然对这些事情在大海捞针中做了什么感到困惑。搜索结束后搜索你放入你的字段继承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 %}
正如您所看到的,模板有一些我的索引类没有的字段,但搜索后端会搜索这些字段。那么为什么甚至在索引中都有字段呢?索引类的卷和索引模板是什么?有人可以向我解释一下。
答案 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)