将日期插入epoch_seconds,输出为格式化日期

时间:2018-03-18 16:12:15

标签: datetime elasticsearch formatting

我有一组时间戳,格式为自纪元以来的秒数。我想以onClick的形式插入ElasticSearch,但是当查询时希望将输出看作一个漂亮的日期,例如epoch_seconds

我的下面的映射保留了输入所带来的格式 - 有没有办法通过mapping api将输出规范化为一种格式?

当前映射:

strict_date_optional_time

示例文档

PUT example
{
  "mappings": {
    "time": {
      "properties": {
        "time_stamp": {
          "type": "date",
          "format": "strict_date_optional_time||epoch_second"
        }
      }
    }
  }
}

获取示例/ _search输出:

POST example/time
{
  "time_stamp": "2018-03-18T00:00:00.000Z"
}

POST example/time
{
  "time_stamp": "1521389162" // Would like this to output as: 2018-03-18T16:05:50.000Z
}

1 个答案:

答案 0 :(得分:1)

Elasticsearch区分_source和所谓的存储字段。第一个应该代表你的意见。

如果您实际使用存储的字段(通过在映射中指定store=true),请指定multiple date formats这很容易:(强调我的)

  

可以通过||分隔多种格式来指定作为分隔符。将依次尝试每种格式,直到找到匹配的格式。 第一种格式将用于将毫秒 - 自 - 纪元值转换回字符串。

我已经使用elasticsearch 5.6.4进行了测试,并且工作正常:

PUT /test -d '{ "mappings": {"doc": { "properties": {"post_date": {
    "type":"date",
    "format":"basic_date_time||epoch_millis",
    "store":true
} } } } }'

PUT /test/doc/2 -d '{                                                                                                                            
    "user" : "test1",
    "post_date" : "20150101T121030.000+01:00"
}'

PUT /test/doc/1 -d '{                                                                                                                            
    "user" : "test2",
    "post_date" : 1525167490500
}'

注意使用GET /test/_search?stored_fields=post_date&pretty=1

时,两种不同的输入格式将产生相同的格式
{
    "hits" : [
      {
        "_index" : "test",
        "_type" : "doc",
        "_id" : "2",
        "_score" : 1.0,
        "fields" : {
          "post_date" : [
            "20150101T111030.000Z"
          ]
        }
      },
      {
        "_index" : "test",
        "_type" : "doc",
        "_id" : "1",
        "_score" : 1.0,
        "fields" : {
          "post_date" : [
            "20180501T093810.500Z"
          ]
        }
      }
    ]
}

如果您想更改输入(在_source中),那么您还不是很幸运,mapping-transform功能已被移除:

  

这在2.0.0中已弃用,因为它使调试变得非常困难。截至目前,除了在客户端应用程序中转换文档之外,确实没有其他功能可供使用。

如果您不想更改存储数据,而是想对格式化输出感兴趣,请查看this answer to Format date in elasticsearch query (during retrieval)