我使用Haystack 1.2.6和Whoosh 2.4以及Django 1.3。 假设我们有以下模型描述了一个假设的帖子。
Post(models.Model):
title = models.CharField()
body = models.TextField()
我们建立了这样的post post索引,用于在body字段上自动完成:
PostIndex(SearchIndex):
text = CharField(document=True, use_template=True)
content_auto = indexes.EdgeNgramField(model_attr='body')
彻底阅读了干草堆文档,我无法找到是否可以在标题和正文字段上自动完成。
所以...是可能还是......?
答案 0 :(得分:7)
我已设法根据this进行操作。您只需为要在索引中自动完成的每个字段创建一个EdgeNgramField,然后将自动完成应用于两个不同的搜索查询集并将它们连接起来:
sqs = SearchQuerySet().models(Post)
sqs1 = sqs.filter(title_auto=q)
sqs2 = sqs.filter(body_auto=q)
sqs = sqs1 | sqs2
如果你需要做额外的过滤,你需要在自动完成之后进行(至少这是它对我有用的唯一方法)。
答案 1 :(得分:3)
这是一种更简单的方法,在模板和模板中进行连接。使用EdgeNgramField
(尽管在帖子的主体上这样做很昂贵:
#In search_indexes.py
PostIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.EdgeNgramField(document=True, use_template=True)
#In <app>\template\search\index\<app>\post_text.txt
{{ object.title }} {{object.body}}
然后所有这些查询都将在标题和&amp;体
sqs = SearchQuerySet().models(Post).autocomplete(text='hello')
P.S。使用Haystack 2.x