因此,我们尝试按颜色汇总所有文档,
对于每种颜色,找到最大时间戳为 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
的存储桶。
任何帮助?
答案 0 :(得分:2)
也许您可以使用脚本在最终聚合中过滤掉不需要的记录(在您的案例记录中使用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时间。
答案 1 :(得分:0)
您需要将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"
}
}
}
}
}
}
}
}