elasticsearch_dsl aggs“热门搜索”操作将返回dict而不是文档

时间:2018-09-07 08:35:27

标签: python-3.x elasticsearch-dsl

我的elasticsearch_dsl版本6.3.1,我的代码如下:


s = MyDoc.search()   s.aggs.bucket(“ top_recommends”,“ terms”,field =“ recommend_name”,order = {“ _ count”:“ desc”})。metric(“ top_hit_three”,“ top_hits”,size = 3)

但是返回的结果是response.aggregations.top_recommends.buckets中的dict,我想是存储桶包含MyDoc的实例。这是elasticsearch_dsl的错误吗?

2 个答案:

答案 0 :(得分:0)

这似乎与您的设置有误,可以在测试套件中使用,如您在https://github.com/elastic/elasticsearch-dsl-py/blob/master/test_elasticsearch_dsl/test_integration/test_search.py#L43-L53上看到的

如果它对您不起作用,则确实可能是一个错误,您能否提出一个可以复制的问题?谢谢!

答案 1 :(得分:0)

Honza,
  谢谢你的帮助。我找到了原因。 在测试函数“ def test_top_hits_are_wrapped_in_response(data_client)”中,对aggs结果的访问如下:

hits = [h for h in top_commits.hits]
# Test code
print(type(hits))
print(type(hits[0]))

输出为

<class 'elasticsearch_dsl.utils.AttrList'>
<class 'es.es_models.QuestionIntent'>

但是我的代码就是这样:

hits = top_commits.hits.hits
print(type(hits))
print(type(hits[0])

,输出为:

<class 'list'>
<class 'dict'>

似乎在“ top_commits.hits”对象列表中有一个“ hits”属性。我建议如果您不想将其提供给公众使用,则应将该属性设置为屏蔽。无论如何,我以为我应该像在ES搜索结果json路径中显示的那样访问aggs结果对象路径,所以我陷入了错误的结果访问方法。