6

我将 haystack 1.2.6 与 Whoosh 2.4 和 Django 1.3 一起使用。假设我们有以下模型描述了一个假设的帖子。

Post(models.Model):
    title = models.CharField()
    body = models.TextField()

我们为 body 字段的自动完成构建了这样的 post 索引:

PostIndex(SearchIndex):
    text = CharField(document=True, use_template=True)
    content_auto = indexes.EdgeNgramField(model_attr='body')

彻底阅读了 haystack 文档后,我找不到是否可以在标题和正文字段上进行自动完成。

那么......有可能还是......?

4

2 回答 2

9

我已经设法在基础上做到了。您只需为要在索引中自动完成的每个字段创建一个 EdgeNgramField,然后将自动完成应用于两个不同的搜索查询集并将它们连接起来:

sqs = SearchQuerySet().models(Post)
sqs1 = sqs.filter(title_auto=q)
sqs2 = sqs.filter(body_auto=q)

sqs = sqs1 | sqs2

如果您必须进行额外的过滤,则需要在自动完成之后进行(至少这是它对我有用的唯一方法)。

于 2013-04-15T22:23:48.240 回答
4

这是一种更简单的方法,在模板中进行连接并使用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}}

然后所有此类查询将在标题和正文上自动完成

sqs = SearchQuerySet().models(Post).autocomplete(text='hello')

PS 使用 Haystack 2.x

于 2014-10-07T13:45:28.527 回答