具有 after_key 和 size 的 ElasticSearch 复合聚合

Posted

技术标签:

【中文标题】具有 after_key 和 size 的 ElasticSearch 复合聚合【英文标题】:ElasticSearch composite agreggation with after_key and size 【发布时间】:2020-12-09 23:30:51 【问题描述】:

我有疑问。如果我使用设置大小的直方图复合聚合。 例如我有整数范围。聚合中的每个数字桶代表 1 天(使用整数作为日期并不重要)。

如果我使用size 并说我想得到 10 个桶作为结果。我可以可靠地使用after_key 来选择我的聚合日期吗?

因为如果我按特定日期范围进行过滤,我也会得到过滤范围之外的存储桶,因为一些文档会在那里,因为直方图是在间隔字段上创建的(data_range 字段类型上的日期直方图也是如此)。

我的想法是使用after_key 的组合来设置实际开始日期和size 来选择我想要多少天的结果。

让我担心的是来自documentation:

after_key通常是响应中返回的最后一个存储桶的键,但这不能保证。始终使用返回的after_key,而不是从存储桶中派生它。

如果说: after_key: 10 size: 5 after_key: 15 size: 5

或者更好的问题是,最后返回的存储桶与下一个 after_key 不匹配的情况是什么?

这对于 Kibana 正确显示时间也很有用,但有些桶可能代表 30 年的范围,通常只查询 1 个月。所以如果我能正确分页,我可以节省很多。

【问题讨论】:

【参考方案1】:

据我了解,您希望具有复合聚合的滚动功能。 我是对的,你在正确的轨道上。

将其视为 SQL 中的偏移键,但不是提供行号,而是指定最后一行的值。

它的工作方式是在进行复合聚合时会跳过行直到after_key 中提到的行并返回下一个集合或长度size

如果新文档是这两个调用之间的索引,您可能会错过/超出/等一些数据的唯一地方。就像您从 1 到 5 获得的前 5 个文档一样,然后一些新文档被索引并插入/位于这些第一个结果之间。您可能会错过那些,因为您在 5 点之后要求记录的第二个电话。

否则你很好。

我经常使用复合聚合,因为它有助于读取普通搜索 API 无法读取的聚合数据。

只需跟踪after_key,当桶的长度变为零时,您就可以关闭循环。

【讨论】:

以上是关于具有 after_key 和 size 的 ElasticSearch 复合聚合的主要内容,如果未能解决你的问题,请参考以下文章

Logstash

查找任何行的总和是不是等于具有 SUM、ANY、SIZE 的任何列的总和

如果类具有析构函数/ delete [],则成员运算符new []的参数“size”会增加

是否可以将 page_size 存储到具有静态存储持续时间的对象中?

另一个项目中具有本地化资源的 Blazor Server-Size

具有大小的超级特征的特征仍然有错误“std :: marker :: Sized不满意”[重复]