我有一个 Elasticsearch 查询,可以聚合每个指定间隔的数据。
GET test-index/_search
{"size": 0,
"query":{
"bool":{
"must":[
{
"match":{ "devEui":"xxx"}
},
{
"range":{
"timestamp":{
"gte":"2024-09-30T22:20:00.000Z",
"lte":"2024-10-01T02:20:00.000Z"
}
}
}
]
}
},
"aggs":{
"thumbnails":{
"date_histogram":{
"field":"timestamp",
"interval":"300s"
},
"aggs":{
"attribute_data":{"avg":{"field":"signalStrength"}}
}
}
}
}
此查询将数据聚合到 5 分钟的存储桶中,并将键设置为向下舍入的时间戳(例如,从
2024-09-30T22:20:00.000Z
到 2024-09-30T22:25:00.000Z
的数据聚合到键为 2024-09-30T22:20:00.000Z
的存储桶中)。
如何舍入密钥,以便从
2024-09-30T22:20:00.000Z
到 2024-09-30T22:25:00.000Z
的数据聚合到密钥为 2024-09-30T22:25:00.000Z
的存储桶中?
目前,我正在查询后更新时间戳,但希望查询能够处理此问题。
我正在使用 Elasticsearch 7.10。
谢谢你。
Elasticsearch 的
date_histogram
聚合本质上会将时间戳向下舍入到最近的间隔。此行为是设计使然,并且没有直接选项可以在 date_histogram
聚合本身内对存储桶键进行舍入。不过,您可以通过在查询级别调整时间戳字段来达到预期的效果。
GET test-index/_search
{
...
"aggs": {
"thumbnails": {
"date_histogram": {
"script": {
"source": """
long interval = 300000;
long rounded = Math.ceil(doc['timestamp'].value.getMillis() / interval) * interval;
return rounded;
""",
"lang": "painless"
},
"interval": "300s"
},
"aggs": {
"attribute_data": {
"avg": {
"field": "signalStrength"
}
}
}
}
}
}