Django-haystack:添加 `content_auto` 行后重建索引失败(haystack.exceptions.SearchFieldError)

7 投票
3 回答
1248 浏览
提问于 2025-04-17 13:24

我正在尝试实现一个功能,就是在搜索一个单词的部分内容时能得到结果,这个功能在Haystack文档中叫做autocomplete,如果我没记错的话。

举个例子:

搜索 "gol"

结果是 "goldfish"

我尝试了什么?

我按照文档中的第一步做了,往我的索引类里添加了以下一行:

content_auto = indexes.EdgeNgramField(model_attr='content')

然后我执行了 python manage.py rebuild_index

但是重建索引时出现了一个错误 haystack.exceptions.SearchFieldError: 模型 '<Person: Reginald>' 没有 'content' 这个属性。 这里的Reginald是我索引表中的第一个条目,而Person是我索引的模型。

确实,我的模型里没有叫content的字段,但根据文档的说明,它应该不需要有这样的字段。

我使用的是Whoosh 2.4.1Django-haystack 1.2.7Django 1.4

3 个回答

1

这里有一个更新的示例供参考(可以在这里查看):

#search_indexes.py
class Book(indexes.SearchIndex, indexes.Indexable):
    text = indexes.EdgeNgramField(document=True, use_template=True)

    def get_model(self):
        return Book

#template
{{object.name}}

#query
SearchQuerySet().autocomplete(text=my_query)
3

这是我现在解决这个问题的方法。

不要这样写:

content_auto = indexes.EdgeNgramField(model_attr='content')

而是这样:

content_auto = indexes.EdgeNgramField(use_template=True)

这样你就可以为这些内容创建一个模板。例如,我在我的 catalog 应用里有一个 ItemIndex,我想搜索 namedescription。所以,我在 templates/search/indexes/catalog/ 目录下创建了一个叫 item_content_auto.txt 的文件,里面写了以下内容:

{{ object.name }}
{{ object.description }}

这看起来能按照我想要的方式工作。虽然比直接用 'content' 要麻烦一点,但应该能满足我的需求。

撰写回答