繁体   English   中英

在弹性搜索 date_histogram 聚合中将长时间戳表示为日期

[英]Representing a long timestamp as date in elastic search date_histogram aggregation

我有一个带有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
            }
        }
    }
}

尝试在每天的文档基础上进行汇总。 运行正常,但是bucket输出如下:

{
    "key_as_string": "yyyy-MM-dd1577836800000",
    "key": 1577836800000,
    "doc_count": 3
}

我的问题是:我怎么能渲染key_as_string要的东西,如2020-01-01不改变字段类型左右。

您可以使用无痛脚本语言来实现您想要的功能,但效率不高,因为无痛脚本在字段操作方面有很多开销。 这是执行此操作的脚本方法

您可以设置格式并将长时期转换为纪元的瞬间并按照您想要的方式对其进行格式化。 如前所述,这效率不高,但可以完成工作。

{
  "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 字段并使用日期数据类型,则您不必运行脚本并使用其复制到的字段进行聚合。

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
            }
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM