ES:Bucket agg + top_hits + scroll?如何 return 桶中的所有命中(超过 `size+from` max)?

ES: Bucket agg + top_hits + scroll? How to return all hits (more than `size+from` max) in buckets?

我运行正在使用一个很大的 elasticsearch 过滤器。 (约 1000 万次点击)结果。我的 from+size 最大值是默认值(10,000 次点击)。我想基于一个字段进行聚合,并且 return 所有桶中过滤器的所有命中(不仅仅是计数)。

我知道我可以使用 top_hits 来获取每个存储桶中的实际文档 (),但我认为我需要滚动以获取所有内容(比第一个获取更多10000 次点击)。我可以滚动和聚合吗? scroll api 当我 运行 使用聚合时失败。

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

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

  2. 运行 1大过滤查询,不聚合,而是使用滚动api获取所有命中。然后我会把它们放在主机上的相应存储桶中。 (好吧,但似乎 ES 是为我将这些聚合到桶中而设置的,并且有更多资源来完成这项工作)

有没有更好的方法来处理这个问题?

这似乎与此有关:()虽然没有提到滚动 api(除非这就是分页的意思?)

我认为您的用例不受支持。专门聚合 "throw out" 文档中的其他信息。 Top hits 只是意味着 return the most relevant 在每个与您的查询匹配的存储桶中命中。这更像是一个评分功能而不是文档检索功能,即热门点击聚合并不意味着 return 存储桶中的所有文档。

如果您无论如何都需要所有文档,为什么不自己汇总结果呢?这是您的第 2 个选项,对我来说似乎是最佳选项。

you referenced describes a workaround for paging in an aggregation by using the exclude value filter in terms aggregations。它不使用卷轴api。我也不认为它对你有帮助。

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

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