Django-haystack:添加 `content_auto` 行后重建索引失败(haystack.exceptions.SearchFieldError)
我正在尝试实现一个功能,就是在搜索一个单词的部分内容时能得到结果,这个功能在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.1
、Django-haystack 1.2.7
和Django 1.4
。
3 个回答
这里有一个更新的示例供参考(可以在这里查看):
#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)
这是我现在解决这个问题的方法。
不要这样写:
content_auto = indexes.EdgeNgramField(model_attr='content')
而是这样:
content_auto = indexes.EdgeNgramField(use_template=True)
这样你就可以为这些内容创建一个模板。例如,我在我的 catalog
应用里有一个 ItemIndex
,我想搜索 name
和 description
。所以,我在 templates/search/indexes/catalog/
目录下创建了一个叫 item_content_auto.txt
的文件,里面写了以下内容:
{{ object.name }}
{{ object.description }}
这看起来能按照我想要的方式工作。虽然比直接用 'content'
要麻烦一点,但应该能满足我的需求。