聚合低于值的最大时间戳
Aggregate over the maximum timestamp lower than value
因此,我们尝试按颜色汇总所有文档,
对于每种颜色,找到最大时间戳为 max_timestamp。
然后,仅过滤 max_timestamp 低于 now-5m
的桶。
这里的想法是检查是否有任何颜色没有报告最近 5 分钟的文件。
这是我们现在得到的:
{
"size": 0,
"aggs": {
"colors_aggs": {
"terms": {
"field": "color",
"size": 10
},
"aggs": {
"max_timestamp": {
"max": {
"field": "timestamp"
}
},
"aggs": {
"filter": {
"range": {
"timestamp": {
"lt": "now-5m"
}
}
}
}
}
}
}
}
好像忽略了第三个聚合。显示时间戳大于 now-5m
的存储桶。
有什么帮助吗?
您需要将 max_timestamp
聚合作为过滤器聚合的子聚合。像这样尝试:
{
"size": 0,
"aggs": {
"colors_aggs": {
"terms": {
"field": "color",
"size": 10
},
"aggs": {
"5m": {
"filter": {
"range": {
"timestamp": {
"lt": "now-5m"
}
}
},
"aggs": {
"max_timestamp": {
"max": {
"field": "timestamp"
}
}
}
}
}
}
}
}
更新
如果您希望 now-5m
过滤器应用于整个聚合部分,那么您可以将其作为顶部聚合移动,如下所示:
{
"size": 0,
"aggs": {
"5m": {
"filter": {
"range": {
"timestamp": {
"lt": "now-5m"
}
}
},
"aggs": {
"colors_aggs": {
"terms": {
"field": "color",
"size": 10
},
"aggs": {
"max_timestamp": {
"max": {
"field": "timestamp"
}
}
}
}
}
}
}
}
也许您可以使用脚本在最终聚合中过滤掉不需要的记录(在您的情况下是 timestamp > "now - 5m"
的记录),然后您的最终聚合(以及最终的输出)将仅基于想要的记录。
查询应该是这样的:
{
"size": 0,
"aggs": {
"colors_aggs": {
"terms": {
"field": "color",
"size": 10
},
"aggs": {
"maximals": {
"max": {
"field": "timestamp":
}
},
"max_bucket_filter": {
"bucket_selector": {
"buckets_path": {
"maxs": "max_timestamp"
},
"script": {
"lang": "expression",
"script": "maxs < [CurrentUnixTime x 1000]"
}
}
}
}
}
}
}
注意上面的脚本不能接受关键字now-5m
所以你每次执行查询时都必须设置当前的unix时间。
因此,我们尝试按颜色汇总所有文档,
对于每种颜色,找到最大时间戳为 max_timestamp。
然后,仅过滤 max_timestamp 低于 now-5m
的桶。
这里的想法是检查是否有任何颜色没有报告最近 5 分钟的文件。
这是我们现在得到的:
{
"size": 0,
"aggs": {
"colors_aggs": {
"terms": {
"field": "color",
"size": 10
},
"aggs": {
"max_timestamp": {
"max": {
"field": "timestamp"
}
},
"aggs": {
"filter": {
"range": {
"timestamp": {
"lt": "now-5m"
}
}
}
}
}
}
}
}
好像忽略了第三个聚合。显示时间戳大于 now-5m
的存储桶。
有什么帮助吗?
您需要将 max_timestamp
聚合作为过滤器聚合的子聚合。像这样尝试:
{
"size": 0,
"aggs": {
"colors_aggs": {
"terms": {
"field": "color",
"size": 10
},
"aggs": {
"5m": {
"filter": {
"range": {
"timestamp": {
"lt": "now-5m"
}
}
},
"aggs": {
"max_timestamp": {
"max": {
"field": "timestamp"
}
}
}
}
}
}
}
}
更新
如果您希望 now-5m
过滤器应用于整个聚合部分,那么您可以将其作为顶部聚合移动,如下所示:
{
"size": 0,
"aggs": {
"5m": {
"filter": {
"range": {
"timestamp": {
"lt": "now-5m"
}
}
},
"aggs": {
"colors_aggs": {
"terms": {
"field": "color",
"size": 10
},
"aggs": {
"max_timestamp": {
"max": {
"field": "timestamp"
}
}
}
}
}
}
}
}
也许您可以使用脚本在最终聚合中过滤掉不需要的记录(在您的情况下是 timestamp > "now - 5m"
的记录),然后您的最终聚合(以及最终的输出)将仅基于想要的记录。
查询应该是这样的:
{
"size": 0,
"aggs": {
"colors_aggs": {
"terms": {
"field": "color",
"size": 10
},
"aggs": {
"maximals": {
"max": {
"field": "timestamp":
}
},
"max_bucket_filter": {
"bucket_selector": {
"buckets_path": {
"maxs": "max_timestamp"
},
"script": {
"lang": "expression",
"script": "maxs < [CurrentUnixTime x 1000]"
}
}
}
}
}
}
}
注意上面的脚本不能接受关键字now-5m
所以你每次执行查询时都必须设置当前的unix时间。