2015-12-17 2 views
4

Я пытаюсь получить Elasticsearch для распознавания строк в формате yyyy-MM-dd HH:mm:ss в качестве полей даты. Я создал динамический формат даты и применил это к отображению по умолчанию. Он отлично работает при индексировании документов моего первого типа - любые новые поля, в которых данные находятся в этом формате, инициализируются как поля даты.Как применить динамические форматы дат к нескольким типам в Elasticsearch?

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

Вот пример набора Kibana команды, чтобы продемонстрировать:

DELETE /datetest 

PUT /datetest 

PUT /datetest/_mapping/_default_ 
{ 
    "dynamic_date_formats" : ["yyyy-MM-dd HH:mm:ss"] 
} 

PUT /datetest/doc/1 
{ 
    "date" : "2015-01-01 12:00:00" 
} 

# This one works fine 
PUT /datetest/otherdoc/1 
{ 
    "otherdate" : "2015-01-01 12:00:00" 
} 

# This one does not 
PUT /datetest/otherdoc/2 
{ 
    "date" : "2015-01-01 12:00:00" 
} 

Последняя команда дает эту ошибку: "Invalid format: \"2015-01-01 12:00:00\" is malformed at \" 12:00:00\""

Я знаю, что поля с одинаковым именем в разных типах должны иметь те же данные, тип, но в этом случае я хочу, чтобы у них был тот же тип данных - дата. Я мог вручную создавать сопоставления для каждого нового типа, но я хочу, чтобы он автоматически поддерживал новые типы, добавляемые к моим исходным данным. Кажется, это то, что должен делать динамический формат даты. Я здесь что-то не так?

ответ

1

Я бы создал пользовательский динамический шаблон. Что-то вроде этого:

PUT /datetest/_mapping/_default_ 
{ 
    "date_detection" : true, 
    "dynamic_templates" : [ 
     { 
      "dates" : { 
       "match" : ".*date.*", 
       "mapping" : { 
        "type" : "date", 
        "format" : 'yyyy-MM-dd HH:mm:ss' 
       } 
      } 
     } 
    ] 
} 

Просто попробовал. Кажется, это работает. Я надеюсь, что это помогает :)

1

Все, что я могу думать, было бы добавление динамического шаблона:

PUT /datetest 
{ 
    "mappings": { 
    "_default_": { 
     "date_detection": false, 
     "dynamic_templates": [ 
     { 
      "dates": { 
      "match": ".*Date|date", 
      "match_pattern": "regex", 
      "mapping": { 
       "type": "date", 
       "format": "yyyy-MM-dd HH:mm:ss||dateOptionalTime" 
      } 
      } 
     } 
     ] 
    } 
    } 
} 

Все три оператора будет работать нормально:

PUT /datetest/doc/1 
{ "date" : "2015-01-01 12:00:00" } 
PUT /datetest/otherdoc/1 
{ "otherdate" : "2015-01-01 12:00:00" } 
PUT /datetest/otherdoc/2 
{ "date" : "2015-01-01 12:00:00" } 

Динамический шаблон будет пытаться соответствовать имя вашего поля на основе шаблона. Они должны заканчиваться или Дата.

Я знаю, что вам нужен только формат yyyy-MM-dd HH:mm:ss, но я также добавил значение по умолчанию, так что Elasticsearch может выбрать один из нескольких.

+0

Великие умы думают как;) –

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