Elasticsearch 7:无法解析日期

时间:2019-05-29 20:29:02

标签: python-3.x elasticsearch date-formatting

我有一个带有带有日期字段的映射的elasticsearch索引

"datetime": {
                "type": "date",
                "format": "date_optional_time"
            }

但是当我尝试传递

'05/09/2019 11:43:09 AM'

并将其编入索引,我得到

elasticsearch.exceptions.RequestError: RequestError(400, u'mapper_parsing_exception', u"failed to parse field [datetime] of type [date] in document with id 'VhhGBWsBeH-i3pqE8QBW'")

我尝试过

"datetime": {
               "type": "text"
            }

当然可以。

我在做什么错?我应该为05/09/2019 11:43:09 AM之类的日期使用哪种日期格式?

@Kamal

非常感谢您的帮助。仅此而已,上述格式对于'05/09/2019 01:00:37 PM'PM的任何值都失败。我尝试过

"datetime": {
                "type": "date",
                "format": "MM/dd/yyyy HH:mm:ss a||MM/dd/yyyy HH:mm:ss p"
            }

但是我明白了

"Invalid format: [MM/dd/yyyy HH:mm:ss p]: Pad letter 'p' must be followed by valid pad pattern: MM/dd/yyyy HH:mm:ss p"

如果我尝试

"datetime": {
                "type": "date",
                "format": "MM/dd/yyyy HH:mm:ss aa"
            }

我得到

elasticsearch.exceptions.RequestError: RequestError(400, u'illegal_argument_exception', u'Invalid format: [MM/dd/yyyy HH:mm:ss aa]: Too many pattern letters: a')

1 个答案:

答案 0 :(得分:1)

这是因为您提到的日期格式不符合date_optional_time,它基于ISO 8601标准。

在与date_optional_time相关的elasticsearch link中,它提到了以下注释:

  

date_optional_time strict_date_optional_time

     

通用的ISO日期时间解析器,其中日期为必填项,时间为可选。

根据ISO 8601,以下是一些有效值:

  • yyyy-MM-ddTHH:mm:ss
  • yyyy-MM-ddTHH:mm
  • yyyy-MM-ddTHH:mm:ss.SSSSSSSSS

还要注意,ISO 8601 使用24小时日期格式

因此,查看您的样本,以下日期值将对此有效。

POST <your_index_name>/_doc/1
{
  "datetime": "2019-05-09T13:30:00"
}

解决方案:

您要查找的格式是 MM/dd/yyyy hh:mm:ss a dd/MM/yyyy hh:mm:ss a (我会根据您的要求将两种格式都保留给您) 。

下面是映射的样子。

PUT <your_index_name>
{  
   "mappings":{  
      "properties":{  
         "datetime":{  
            "type":"date",
            "format":"date_optional_time||MM/dd/yyyy hh:mm:ss a"
         }
      }
   }
}

以下内容现在可以使用:

POST <your_index_name>/_doc/1
{
  "datetime": "05/09/2019 11:43:09 AM"
}

希望有帮助!