Сохранение даты и времени с необязательными параметрами в индексе эластичного поиска?

Итак, я разрабатываю приложение, в котором мне нужен инструмент поиска, который будет индексировать фотографии и документы, но иногда я не буду знать точный месяц или день, в который был создан документ, поэтому до сих пор я сохранял даты в моя таблица MySQL как date или же datetime поле, которое допускает необязательные значения:

2015-03-11 // Valid MySQL date
2015-12-00 // Also a valid MySQL date, but a null day to represent 'it is not known'
2015-00-00 // Another valid MySQL date, with a null date and month to represent 'this document came from the year 2015, but at some unknown point'

Теперь, это на самом деле работает довольно хорошо, MySQL по-прежнему будет упорядочивать и сортировать даты соответствующим образом.

Однако сейчас я пришел к созданию инструмента поиска с использованием Elasticsearch, и он явно не доволен этим синтаксисом. Попытка индексировать документ с указанием даты и времени со значениями вне диапазона (например, 2015-00-00) приводит к этому ответу:

{
"error":"MapperParsingException[failed to parse [originated_at]]; nested: MapperParsingException[failed to parse date field [2015-00-00], tried both date format [dateOptionalTime], and timestamp number with locale []]; nested: IllegalFieldValueException[Cannot parse \"2015-00-00\": Value 0 for monthOfYear must be in the range [1,12]]; ",
"status":400
}

По понятным причинам. Однако необязательные даты являются обязательным требованием, и мне нужно выбранное мной решение, чтобы это сделать.

Каков наилучший способ заставить Elasticsearch позволить мне хранить необязательные свойства даты и при этом иметь возможность упорядочивать и выполнять поиск по датам?

2

Решение

В вашем отображении вы можете объявить поле даты с несколькими различными форматами разделены ||, как это:

{
"date_field": {
"type": "date",
"format": "yyyy||yyyy-MM||yyyy-MM-dd"}
}

В результате вы сможете сохранить любую из следующих дат:

  • 2015 (т.е. yyyy)
  • 2015-12 (т.е. yyyy-MM)
  • 2015-12-01 (т.е. yyyy-MM-dd)

Попробуйте это.

1

Другие решения

Настройте отображение:

{
"yourIndex": {
"properties": {
"date": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss"}
}
}
}

Кроме того, посмотрите Вот — Формат даты отображения Elasticsearch.

1

По вопросам рекламы [email protected]