Elasticsearch и ошибка «failed to parse field [time] of type [date]»

Thank you for reading this post, don't forget to subscribe! 

В один пре­крас­ный день, elastic может сой­ти с ума. Пере­стать при­ни­мать инфор­ма­цию в индекс и начать кидать в логи ошиб­ки типа:

failed to parse field [time] of type [date]

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

Какой фор­мат исполь­зу­ет­ся мож­но уви­деть в mapping инте­ре­су­ю­ще­го вас индекса:

GET /index-name/_mapping

Сле­ду­ю­щая заса­да, вы не може­те на лету поме­нять тип поля в индек­се. Толь­ко путем пере­со­зда­ния индек­са с нуля.

И самое про­тив­ное. Если вы исполь­зу­е­те груп­пу индек­сов в IndexPattern, сбой­ный индекс выле­тит из поис­ка по про­блем­но­му полю.

Вобщем про­блем с таки­ми «пры­га­ю­щи­ми» типа­ми полей  будет чер­тов­ски мно­го. Поэто­му, реко­мен­дую «гвоз­дя­ми» при­би­вать тип поля в индексе.

Напри­мер, в индек­се есть поле, содер­жа­щее дату. В Elastic такие поля могут попасть под шаб­лон (mapping) по умол­ча­нию для даты и в индек­се появит­ся поле типа date. Потом про­грам­ме­ры поме­ня­ют фор­мат даты и поле пере­ста­ет под­хо­дить под шаб­лон. Эла­стик будет счи­тать что это поле типа text и тупо пере­ста­ет добав­лять инфор­ма­цию в индекс.

Если вы не пла­ни­ру­е­те в даль­ней­шем исполь­зо­вать поле для поис­ка, самое про­стое реше­ние при­ве­сти его к типу text. В даль­ней­шем, сме­на фор­ма­та даты нико­им обра­зом не повли­я­ет на рабо­ту индекса.

Созда­ние шаб­ло­на для индек­са или груп­пы индексов.

Посмот­реть все шаб­ло­ны мож­но так:

GET _template
Посмот­реть кон­крет­ный шаблон:

GET _template/template_name
Создать шаблон:

 

Пара­метр index-patterns опре­де­ля­ет шаб­лон имён индек­сов к кото­рым будет при­ме­нять­ся дан­ный template. Т.е. если будет создан индекс с , напри­мер, име­нем index-name-2020.04.01, то шаб­лон будет к нему при­ме­нен. И в даль­ней­шем в спис­ке mappings вы уви­ди­те, что поле time будет иметь тип text.

Так же в этом шаб­лоне огра­ни­чи­ва­ет­ся коли­че­ство шар­дов еди­ни­цей. По умол­ча­нию у вновь созда­ва­е­мо­го шаб­ло­на зна­че­ние это­го пара­мет­ра рав­но 3. Такое огра­ни­че­ние име­ет смысл для неболь­ших индек­сов. Мак­си­маль­ное коли­че­ство шар­дов на сер­вер огра­ни­че­но и при боль­шом коли­че­стве индек­сов име­ет смысл на один индекс давать один шард.