【问题标题】:Elasticsearch date histogramElasticsearch 日期直方图
【发布时间】:2020-12-09 13:58:28
【问题描述】:

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

'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

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

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

【问题讨论】:

    标签: elasticsearch elasticsearch-aggregation


    【解决方案1】:

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

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

    虽然如果您在任何给定的存储桶中有精确的一个值,显示确切的分钟数似乎很有用,但直方图通常聚合一堆值,因此它不会当我们处理每小时间隔时,谈论基于分钟的存储桶键真的很有意义。

    话虽如此,日期直方图确实接受子聚合,因此如果您想以所需格式检索单个文档的 @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
              }
            }
          }
        }
      }
    }
    

    【讨论】:

    • 感谢您的回答。我发现第一个聚合对我的情况很有用。但我有两个问题。您能否解释一下它是否与给定脚本如何工作的问题相关?和给定查询的性能,它与原始聚合相比有多快/多慢,没有子aggs
    • 我的意思是乍一看它执行得很快,但我想知道相对于原来的?
    • 不客气。好吧,脚本因速度慢而臭名昭著,但在这个脚本中,我们只是将 doc 值读入 java 日期格式化程序并吐出日期字符串,一次一个。所以我认为没有显着的性能影响。我在生产中使用了其中的一些。至于一般的脚本: TL;DR 您可以在字段上执行类似 java 的代码,并且该语言被称为无痛。它被认为是最后的解决方案,但它非常适合脚本字段,即转换字段值。
    • 再次感谢!真的很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    • 2015-01-30
    相关资源
    最近更新 更多