django-haystack 自动完成功能无法正常工作
django-haystack autocomplete not working as it should
我正在使用:
Django : 1.7.1
django-haystack : 2.4.1
- 和
elastic search 2.x
作为引擎
索引Class
class WarehouseIndex(SearchIndex, Indexable):
"""
SearchIndex Class that stored indexes for Model Warehouse
"""
text = CharField(document=True, use_template=True)
search_auto = EdgeNgramField()
search_auto2 = NgramField()
....
def get_model(self):
return WareHouse
def prepare(self, obj):
self.prepared_data = super(WarehouseIndex, self).prepare(obj)
search_auto = [obj.name, obj.sublocality,
obj.locality, obj.city]
self.prepared_data['search_auto'] = ' '.join(
[x.lower() for x in search_auto if x is not None])
self.prepared_data['search_auto2'] = ' '.join(
[x.lower() for x in search_auto if x is not None])
return self.prepared_data
我已经使用 rebuild_index 和 运行 中的以下代码构建了索引 shell
>>> from haystack.query import SearchQuerySet, SQ
>>> sqs = SearchQuerySet().models(WareHouse)
>>> sqs.filter(search_auto='pond') # query 1
[]
>>> sqs.filter(search_auto2='pond') # query 2
[]
>>> sqs.filter(search_auto__startswith='pond') # query 3
[<SearchResult: base.warehouse (pk=u'1')>, <SearchResult: base.warehouse (pk=u'22')> ...]
>>> sqs.filter(search_auto2__startswith='pond') # # query 4
[<SearchResult: base.warehouse (pk=u'1')>, <SearchResult: base.warehouse (pk=u'22')> ...]
如您所见,
查询 1 和 2 returns "No result"
查询 3 和 4 returns "same result" 即使 seach_auto 和 search_auto2 都是不同的字段类型 EdgeNgramField 和 NgramField.
编辑:Index mapping, Index Setting
编辑:在进一步检查中,我注意到 haystack 将我的 EdgeNgramField 和 NgramField 视为 CharField - 这里是 term vectors,两者相同
编辑:在进一步检查中,我发现 haystack/backend/elasticsearch_backend.py
在尝试为索引设置映射时静默解析 elasticsearch.exceptions.RequestError
(full trace here)。
为什么我的索引没有正确创建?我做错了什么?
您链接到的 RequestError
确实提供了有用的提示。
您似乎在使用 ES 2.x,而 Haystack 使用 _boost
元字段 has been removed 从 ES 2.0 开始。
您可以看到关于使 Haystack 与 ES 2.0 一起工作的问题 (#1247),并且它仍然是开放的。
此时您可以做的是安装 ES 1.7.5,它会起作用。
或者等到 the fix 在新的 Haystack 版本中发布。
我正在使用:
Django : 1.7.1
django-haystack : 2.4.1
- 和
elastic search 2.x
作为引擎
索引Class
class WarehouseIndex(SearchIndex, Indexable):
"""
SearchIndex Class that stored indexes for Model Warehouse
"""
text = CharField(document=True, use_template=True)
search_auto = EdgeNgramField()
search_auto2 = NgramField()
....
def get_model(self):
return WareHouse
def prepare(self, obj):
self.prepared_data = super(WarehouseIndex, self).prepare(obj)
search_auto = [obj.name, obj.sublocality,
obj.locality, obj.city]
self.prepared_data['search_auto'] = ' '.join(
[x.lower() for x in search_auto if x is not None])
self.prepared_data['search_auto2'] = ' '.join(
[x.lower() for x in search_auto if x is not None])
return self.prepared_data
我已经使用 rebuild_index 和 运行 中的以下代码构建了索引 shell
>>> from haystack.query import SearchQuerySet, SQ
>>> sqs = SearchQuerySet().models(WareHouse)
>>> sqs.filter(search_auto='pond') # query 1
[]
>>> sqs.filter(search_auto2='pond') # query 2
[]
>>> sqs.filter(search_auto__startswith='pond') # query 3
[<SearchResult: base.warehouse (pk=u'1')>, <SearchResult: base.warehouse (pk=u'22')> ...]
>>> sqs.filter(search_auto2__startswith='pond') # # query 4
[<SearchResult: base.warehouse (pk=u'1')>, <SearchResult: base.warehouse (pk=u'22')> ...]
如您所见, 查询 1 和 2 returns "No result" 查询 3 和 4 returns "same result" 即使 seach_auto 和 search_auto2 都是不同的字段类型 EdgeNgramField 和 NgramField.
编辑:Index mapping, Index Setting
编辑:在进一步检查中,我注意到 haystack 将我的 EdgeNgramField 和 NgramField 视为 CharField - 这里是 term vectors,两者相同
编辑:在进一步检查中,我发现 haystack/backend/elasticsearch_backend.py
在尝试为索引设置映射时静默解析 elasticsearch.exceptions.RequestError
(full trace here)。
为什么我的索引没有正确创建?我做错了什么?
您链接到的 RequestError
确实提供了有用的提示。
您似乎在使用 ES 2.x,而 Haystack 使用 _boost
元字段 has been removed 从 ES 2.0 开始。
您可以看到关于使 Haystack 与 ES 2.0 一起工作的问题 (#1247),并且它仍然是开放的。
此时您可以做的是安装 ES 1.7.5,它会起作用。
或者等到 the fix 在新的 Haystack 版本中发布。