我正在使用:
Django : 1.7.1
django-haystack : 2.4.1
elastic search 2.x
作为引擎指数类
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返回“无结果” 查询3和4返回“相同的结果”,即使seach_auto和search_auto2都是字段类型EdgeNgramField和NgramField都不同。
编辑:Index mapping,Index Setting
编辑:对于futhere检查我注意到haystack将我的EdgeNgramField和NgramField视为CharField - 这里是term vectors,两者都是相同的编辑:在进一步检查时,我发现{I} haystack/backend/elasticsearch_backend.py
在尝试设置索引的映射时正在静默解析elasticsearch.exceptions.RequestError
(full trace here)。
为什么我的索引没有正确创建?我做错了什么?
答案 0 :(得分:2)
您链接的RequestError
确实提供了有用的提示。
您似乎使用的是ES 2.x,而Haystack使用的_boost
元字段has been removed从ES 2.0开始。
你可以看到有一个问题(#1247)关于让Haystack与ES 2.0一起工作,它仍然是开放的。
此时你可以做的是安装ES 1.7.5代替它,它会起作用。
或者等到the fix在新的Haystack版本中发布。