django-haystack自动完成不能正常工作

时间:2016-04-01 14:03:49

标签: python django elasticsearch django-haystack

我正在使用:

  • 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 mappingIndex Setting

编辑:对于futhere检查我注意到haystack将我的EdgeNgramField和NgramField视为CharField - 这里是term vectors,两者都是相同的

编辑:在进一步检查时,我发现{I} haystack/backend/elasticsearch_backend.py在尝试设置索引的映射时正在静默解析elasticsearch.exceptions.RequestErrorfull trace here)。

为什么我的索引没有正确创建?我做错了什么?

1 个答案:

答案 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版本中发布。