我正在尝试根据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)
答案 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"