Elasticsearch 日期直方图聚合:向上舍入时间戳键?

问题描述 投票:0回答:1

我有一个 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
1个回答
0
投票

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"
          }
        }
      }
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.