【问题标题】:Representing a long timestamp as date in elastic search date_histogram aggregation在弹性搜索 date_histogram 聚合中将长时间戳表示为日期
【发布时间】:2020-03-06 08:16:17
【问题描述】:

我有一个带有ts 字段的索引,代表纪元毫秒:

"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 之类的东西。

【问题讨论】:

    标签: elasticsearch elasticsearch-aggregation


    【解决方案1】:

    您可以使用painless scripting language 来实现您想要的,但它不会很有效,因为无痛脚本在字段操作方面有很多开销。这是执行此操作的脚本方法

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

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

    【讨论】:

      猜你喜欢
      • 2014-09-25
      • 1970-01-01
      • 2014-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-10
      • 1970-01-01
      相关资源
      最近更新 更多