gpt4 book ai didi

elasticsearch - 在 Elasticsearch date_histogram聚合中将长时间戳表示为日期

转载 作者:行者123 更新时间:2023-12-02 23:10:58 24 4
gpt4 key购买 nike

我有一个索引,其中的ts字段代表时期ms:

"ts": {
"type": "long"
}

请注意,该类型是 long,而不是 epoch_millis日期类型。

我在该字段上运行日期直方图聚合:
{
...
"aggs": {
"agg_name": {
"date_histogram": {
"field": "ts",
"interval": "1d",
"format": "yyyy-MM-dd",
"min_doc_count": 1
}
}
}
}

尝试汇总每天的文档。
该操作运行正常,但是存储桶输出如下:
{
"key_as_string": "yyyy-MM-dd1577836800000",
"key": 1577836800000,
"doc_count": 3
}

我的问题是:如何在不更改字段类型的情况下将 key_as_string呈现为诸如 2020-01-01之类的东西。

最佳答案

您可以使用painless scripting language来实现所需的功能,但效率不高,因为无痛脚本在字段操作中会产生大量开销。这是执行此操作的脚本方法

您可以设置格式,并将long转换为新纪元,然后以所需的方式对其进行格式化。如前所述,这效率不高,但可以完成工作。

{
"aggs": {
"dt_terms": {
"terms": {
"script": {
"source": """
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd").withZone(ZoneId.systemDefault());
return df.format(Instant.ofEpochMilli(doc['ts'].value));
""",
"lang": "painless"
}
}
}
}
}

由于您不想修改原始字段的数据类型,因此可以实现的另一种方法是使用 copy_to字段。在映射中,如果您添加如下所示的新的copy_to字段并使用date数据类型,则不必运行脚本并使用将其复制到的字段进行汇总。
PUT /index_name/_mapping
{
"properties": {
"ts": {
"type": "long",
"copy_to": "ts_d"
},
"ts_d": {
"type": "date"
}
}
}

如果您具有上述映射,则可以使用 reindex API来为新映射建立索引,然后使用下面的查询,该查询现在可用于日期数据类型。
GET /_search
{
"aggs": {
"agg_name": {
"date_histogram": {
"field": "ts_d",
"interval": "1d",
"format": "yyyy-MM-dd",
"min_doc_count": 1
}
}
}
}

关于elasticsearch - 在 Elasticsearch date_histogram聚合中将长时间戳表示为日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60550208/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com