Elasticsearch 7: не могу разобрать дату - PullRequest
0 голосов
/ 29 мая 2019

У меня есть индекс эластичного поиска с отображением, в котором есть поле даты

"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?

@ Камаль

Большое спасибо за вашу помощь. еще одна вещь, приведенный выше формат не подходит для '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 Ответ

1 голос
/ 30 мая 2019

Это потому, что формат, который вы упомянули для вашей даты, не соответствует date_optional_time, который основан на стандартах ISO 8601.

Из ссылки asticsearch , относящейся к date_optional_time, упоминается следующий комментарий:

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

Надеюсь, это поможет!

...