【问题标题】:elasticsearch_dsl aggs 'top-hits' operation return dict instead of documentselasticsearch_dsl aggs 'top-hits' 操作返回字典而不是文档
【发布时间】:2018-09-07 08:35:26
【问题描述】:

我的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 实例的bucket。这是 elasticsearch_dsl 的 bug 吗?

【问题讨论】:

    标签: python-3.x elasticsearch-dsl


    【解决方案1】:

    您的设置似乎有问题,这在测试套件中有效,您可以在 https://github.com/elastic/elasticsearch-dsl-py/blob/master/test_elasticsearch_dsl/test_integration/test_search.py#L43-L53 看到这一点

    如果它对您不起作用,它确实可能是一个错误,您能否提交一个问题并提供一种复制方式?谢谢!

    【讨论】:

    • 很抱歉,我的公司禁止 github 提交。但我可以在这里描述它。
    • s = MyDoc.search(index=user_input,) intent_filter = ~Q('terms', intent__raw=black_intents) input_query = Q('match', user_said=input_key_words) & ~Q('term ', user_said=input_key_words) s =s.filter(intent_filter).query(input_query) s.aggs.bucket("top_recommends", "terms", field="intent.raw", order={"_count": "desc "}).metric("top_hit_three", "top_hits", size=3) return s.execute() 响应奇怪。我不能在上面使用“if response”,因为即使响应中有桶,“if response”也会返回 false。然后当我访问存储桶文档时,它们是字典,而不是对象。
    • 很抱歉,我帮不了你,它在代码中有效,在测试中有效,甚至这段代码也无法为我重现。从 github 打开一个问题与在 SO 上发帖没有什么不同,所以我会敦促您重新考虑,因为这确实属于它。
    • 中间路径访问总是文档对象,我们应该作为列表和字典类型访问它:query_response.aggregations.top_recommends.buckets[0].top_hit_three.hits.hits。最后一个“hits”是python普通类型列表而不是“elasticsearch_dsl.utils.AttrList”,那么里面的所有文档都是dict而不是文档对象。
    • @HenryJohn 请在我发送的链接中获取战利品,该链接显示了它是如何工作的。谢谢!
    【解决方案2】:

    洪萨,
    谢谢你的帮助。我找到了原因。 在你的测试函数“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”属性。如果您不想将其提供给公众使用,我建议该属性应该是屏蔽的。无论如何,我以为我应该访问 aggs 结果对象路径,就像在 ES 搜索结果 json 路径中显示的那样,所以我进入了错误的结果访问方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 2019-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多