2016-09-26 632 views
1

我正在运行一个弹性搜索过滤器, (约1000万点击)的结果。我的from+size max是默认值(10,000次点击)。我想基于一个字段进行聚合,并在所有桶中返回所有过滤器的匹配(而不仅仅是计数)。ES:Bucket agg + top_hits + scroll?如何在桶中返回所有命中(超过`size + from` max)?

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

目前,我有两个解决方案似乎都没有那么大:

  1. 运行多个过滤器的查询,表示各1桶(然后我不需要使用聚合+ top_hits命令)。 (对于我的应用程序太慢)

  2. 运行1个大的过滤器查询,并且不聚集,但使用滚动api获取所有匹配。然后,我将把它们放在我的主机上的相应桶中。 (不错,但好像ES设置用于聚集到这些水桶给我,有更多的资源来完成这项工作)

是否有更好的方法来解决这个问题?

这似乎与此有关:(Paging elasticsearch aggregation results)虽然滚动API没有提到(除非这就是他们所说的分页?)

+0

每个存储桶中是否有超过10,000个文档?或者你有超过10,000个桶,并且想要翻阅这些桶? – jay

+0

某些桶的命中次数超过10,000次。现在我正在看〜500桶。我的总点击量是1600万, – travelingbones

回答

1

我相信不支持您的使用案例。聚合特别将文档中的其他信息“抛出”。 Top hits仅用于在与您的查询匹配的每个存储分区中返回the most relevant匹配。这比文档检索功能更具备评分功能,即顶部命中agg并不意味着要返回存储桶中的所有文档。

如果您仍然需要所有文件,为什么不自己汇总结果?这是你的选择#2,它似乎是我最好的选择。

您引用的SO post描述了通过使用excludevalue filter in terms aggregations在聚合中分页的解决方法。它不使用滚动API。我也不认为它可以帮助你。

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

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

+0

我的目的是将文档聚合成分类,然后从所有字段中构建特征向量。所以,我需要整个文档。我可以从ES桶计数中获得一些功能,但大多数功能都更加复杂,并且在发生事件后需要自定义代码。我确实使用ES对它们进行排序,这是一个好处。我会坚持选项2。 – travelingbones

相关问题