Elasticsearch 日期直方图

Elasticsearch date histogram

我在 @timestamp 字段上使用 elasticsearch 日期直方图聚合。这是查询的一部分:

'stats': {
    'date_histogram': {
        'field': '@timestamp',
        'interval': '1h',
        'format': 'yyyy-MM-dd H:m:s'
    }
}

@timestamp 的映射:

"@timestamp": {
    "type": "date"
}

我的时间间隔是1h。但我还需要从时间戳中提取分钟信息而不对 1m 执行聚合。我试图指定密钥的字符串表示形式的格式。我得到以下输出:

'key_as_string': '2020-11-07 10:0:0'
'key': 1604743200000

有没有办法在聚合结果中包含分钟数?在 keykey_as_string 中?

一个在 es 中索引的 @timestamp 示例:

'@timestamp': '2020-12-09T13:50:46.056000Z'

直方图值 rounded down 到最接近的桶,遵循公式

bucket_key = Math.floor(value / interval) * interval

尽管如果您在任何给定的存储桶中有精确的 one 值,显示确切的分钟数似乎很有用,但直方图通常 aggregate a一堆值,因此当我们以小时为间隔时,谈论基于分钟的存储桶键并没有真正意义。

话虽如此,日期直方图确实接受子聚合,因此如果您想以所需格式检索 个人文档的 @timestamps,您可以利用 top_hits 聚合 script_fields:

{
  "size": 0,
  "aggs": {
    "stats": {
      "date_histogram": {
        "field": "@timestamp",
        "interval": "1h",
        "format": "yyyy-MM-dd H:m:s"
      },
      "aggs": {
        "concrete_values": {
          "top_hits": {
            "script_fields": {
              "ts_with_minutes": {
                "script": {
                  "source": "LocalDateTime.ofInstant(Instant.ofEpochMilli(doc['@timestamp'].value.millis), ZoneId.of('UTC')).format(DateTimeFormatter.ofPattern('yyyy-MM-dd H:m:s'))"
                }
              }
            },
            "size": 10
          }
        }
      }
    }
  }
}

或者,您可能也对最常出现的时间戳感兴趣,按 分钟 分组(format 中省略了秒):

{
  "size": 0,
  "aggs": {
    "stats": {
      "date_histogram": {
        "field": "@timestamp",
        "interval": "1h",
        "format": "yyyy-MM-dd H:m:s"
      },
      "aggs": {
        "most_represented_timestamps": {
          "terms": {
            "field": "@timestamp",
            "format": "yyyy-MM-dd H:m",
            "size": 10
          }
        }
      }
    }
  }
}