Elasticsearch日期格式解析错误

时间:2018-02-21 22:47:45

标签: date elasticsearch elasticsearch-mapping

我正在尝试根据ISO 8601为Elasticsearch字段指定日期格式:

YYYY-MM-DDThh:mm:ssTZD

我把字段映射如下:

"properties": {
                        "startDate": {
                            "type": "date",
                            "format": "YYYY-MM-DD'T'hh:mm:ss'TZD'"
                        }
              }

当我尝试插入包含此字段值为"startDate": "2018-01-10T07:07:07+01:00"的文档时,我收到此错误:

"type": "mapper_parsing_exception",
        "reason": "failed to parse [afield.startDate]",
        "caused_by": {
            "type": "illegal_argument_exception",
            "reason": "Invalid format: \"2018-01-10T07:07:07+01:00\" is malformed at \"+01:00\""
        }

我插入的日期有什么问题吗?我遵循本W3C指南(https://www.w3.org/TR/NOTE-datetime)中给出的示例:

Complete date plus hours, minutes and seconds:

YYYY-MM-DDThh:mm:ssTZD (eg 1997-07-16T19:20:30+01:00) 

3 个答案:

答案 0 :(得分:0)

Elasticsearch日期时间格式可在此处找到:https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-date-format.html

您想要一个没有毫秒的日期时间。为此,请使用以下命令:

 PUT my_index
 {
     "settings" : {
         "number_of_shards" : 1
     },
     "mappings" : {
         "type1" : {
           "properties": {
               "startDate": {
                   "type": "basic_date_time_no_millis",
                        "format": "yyyyMMdd'T'HHmmssZ"
                            }
                         }
                     }    
                  }
     }

时区应该在时间戳中处理,并且可以从以下查询中提取:

 GET /my_index/_search
 {
     "query": {
         "range" : {
             "timestamp" : {
                 "gte": "2018-01-10 07:07:07", 
                 "lte": "now", 
                 "time_zone": "+01:00"
             }
         }
     }
 }

答案 1 :(得分:0)

对于Elasticsearch中的自定义日期格式,您必须检查Joda-time documentation

在您的情况下,您可以尝试yyyy-MM-dd'T'HH:mm:ssZ

"properties": {
  "startDate": {
    "type": "date",
    "format": "yyyy-MM-dd'T'HH:mm:ssZ"
  }
}

使用此功能,您应该能够使用您在示例中使用的日期插入日期并进行搜索:2018-01-10T07:07:07+01:00

答案 2 :(得分:0)

对于所有日期格式为

的人

2016-08-14T00:00:00+02:00

或:

yyyy-MM-ddTHH:mm:ss+HH:MM

您可以考虑在elasticsearch中使用这种格式:

format: "yyyy-MM-dd'T'HH:mm:ss+02:00"