2015-07-26 3 views
2

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

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, и это явно не устраивает этот синтаксис. Попытка индекса документа с DateTime с «из диапазона значений» (например, 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, чтобы я мог хранить дополнительные свойства даты и все еще иметь возможность заказывать и искать по датам?

ответ

1

В вашем картографировании, вы можете объявить поле даты with several different formats отделенного ||, как это:

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

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

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

Попробуйте.

+0

Где я должен хранить это тогда? Если мне нужно только объявление отображения для запуска один раз, как я могу управлять этим, а не запускать его каждый раз, когда мне нужно индексировать объект? Куда поместил бы это в ваше приложение? – ReactingToAngularVues

+0

Вы просто используете это объявление поля в своем сопоставлении и PUT сопоставляете только один раз, прежде чем начинать индексировать свои данные. Не нужно ставить отображение каждый раз. – Val

+0

Вал, это имеет смысл, но я не могу думать о местоположении в моем приложении, которое вызывается только один раз ... мне нужно будет спросить, существует ли индекс, а если нет, то добавить сопоставление? – ReactingToAngularVues

1

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

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

Также смотрите here - Elasticsearch формат даты отображения.

+0

Где я должен это хранить? Если мне нужно только объявление отображения для запуска один раз, как я могу управлять этим, а не запускать его каждый раз, когда мне нужно индексировать объект? Куда поместил бы это в ваше приложение? – ReactingToAngularVues

+0

Насколько я понимаю, это просто место, где можно разместить сопоставление в моем приложении, потому что иначе, если я поместил его в свою функцию «indexObject», сопоставление будет вызываться * everytime * Я индексирую объект; но в идеале отображение - это сценарий «запускается один раз», который нужно вызвать только при создании моего индекса (например, в первом запуске моего приложения). – ReactingToAngularVues

Смежные вопросы