django-haystack 自动完成功能无法正常工作

django-haystack autocomplete not working as it should

我正在使用:

索引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 版本中发布。