问题描述
我有问题。如果我使用设置大小的直方图复合聚合。 例如我有整数范围。聚合中的每个数字存储桶都代表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个月。因此,如果我能正确分页,我可以节省很多。
解决方法
据我了解,您希望具有带有复合聚合的滚动功能。 我是对的,您在正确的轨道上。
在SQL中将其视为偏移键,但您没有指定行号,而是指定了最后一行的值。
它的工作方式是在进行复合聚合时将跳过行,直到after_key
中提到的行,然后返回下一组或长度size
如果新文档在这两个调用之间建立索引,则您可能会错过/超拍/等某些数据。就像您的前5个文档一样,您从1到5得到索引,然后将一些新文档编入索引,并在第一个结果之间插入/谎言。您可能会想念那些,因为您第二次打电话是在5点后要求记录。
否则你很好。
我大量使用复合聚合,因为它有助于读取常规搜索API不可能读取的聚合数据。
只需跟踪after_key
,当存储桶的长度变为零时,您就可以关闭循环。