ES:Bucket agg + top_hits +滚动?如何在桶中返回所有命中(超过`size + from`max)?

时间:2016-09-26 21:55:33

标签: elasticsearch scroll aggregate bucket paginate

我正在运行一个带有大号的弹性搜索过滤器。 (约1000万次点击)结果。我的from+size max是默认值(10,000次点击)。我想基于一个字段进行聚合,并返回所有桶中过滤器的所有命中(不仅仅是计数)。

我知道我可以使用top_hits来获取每个存储桶中的实际文档(ElasticSearch: retriving documents belonging to buckets),但我认为我需要滚动才能获取所有文档(获得超过前10000个点击数量) )。我可以滚动和聚合吗?当我使用聚合运行时,scroll api失败。

目前,我有两个解决方案似乎都不太好:

  1. 运行多个过滤器查询,例如每个桶1个(然后我不需要使用aggregation + top_hits命令)。 (对我的申请来说太慢了)

  2. 运行1个大过滤器查询,不进行聚合,但使用scroll api获取所有匹配。然后我会把它们放在主机上各自的桶中。 (好吧,但似乎ES已设置为将这些汇总到桶中并且有更多资源来完成这项工作)

  3. 有没有更好的方法来解决这个问题?

    这似乎与此相关:( Paging elasticsearch aggregation results)虽然没有提到滚动api(除非这是他们通过分页的意思?)

1 个答案:

答案 0 :(得分:1)

我相信您的用例不受支持。聚合专门“抛弃”文档中的其他信息。 Top hits只是为了在每个存储桶中返回与您的查询匹配的the most relevant次点击。这更像是一个评分特征,而不是文档检索功能,即顶部命中聚合并不意味着返回桶中的所有文档。

如果您还需要所有文件,为什么不亲自汇总结果呢?这是你的选择#2,对我来说似乎是最好的选择。

您引用的SO post使用exclude value filter in terms aggregations描述了聚合中分页的解决方法。它不使用滚动API。我也认为这对你没有帮助。

最后,Elasticsearch术语聚合通常有errors due to shard sizing。如果您仍然需要这些文档,您可以通过在应用程序中执行分段来获得完全准确的聚合 - 您必须访问每个文档,这可能比ES可以做得慢,但您也得到了不同的结果。

如果您有关于用例的更多详细信息,也许我们中的一个人可以提供更好的建议。比如,为什么你需要所有的文件和桶数呢?