Spring boot elastic — установить формат даты по умолчанию

#java #spring #spring-boot #elasticsearch #spring-data-elasticsearch

#java #весна #spring-boot #elasticsearch #spring-data-эластичный поиск

Вопрос:

Мы хотели бы начать хранить очень большую иерархию классов в elastic.

Мы отметили их базовый класс аннотацией @Document, чтобы мы могли хранить всю иерархию в elastic

Многие классы там имеют поля java.util.Date.

К сожалению, сопоставление по умолчанию для этих полей является длинным числом на эластичном. (мы используем spring-boot-starter-data-elasticsearch 2.4.2)

Проблема решается, когда мы помечаем эти поля аннотацией:

 @Field(type = FieldType.Date,format = DateFormat.date_time)
 

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

Ответ №1:

Я не слишком хорошо знаком с spring-boot, но, вообще говоря, если у меня много полей даты с известными шаблонами имен, я настраиваю динамический шаблон регулярных выражений:

 PUT myindex
{
  "mappings": {
      "dynamic_templates": [
        {
          "timeSuffix": {
            "match_mapping_type": "*",
            "match_pattern": "regex",
            "match": "^(.*Time)|(.*At)$",
            "mapping": {
              "type": "date",
              "format": "yyyy-MM-dd HH:mm:ss"
            }
          }
        }
      ]
    }
}
 

и когда я вставляю документы, которые содержат произвольное количество полей, похожих на даты:

 POST myindex/_doc
{
  "createdAt": "2020-01-01 00:00:00",
  "modifiedTime": "2020-01-01 00:00:00"
}
 

сопоставления для них устанавливаются динамически.

Затем это можно проверить с помощью/

 GET myindex/_mapping
 

Комментарии:

1. Это нормально для части Elasticsearch. И только для записи в Elasticsearch этого было бы достаточно. Но Spring Data Elasticsearch также нуждается в информации о формате для анализа возвращенных документов в объекты Java.

Ответ №2:

Исправлена проблема с форматированием путем добавления пользовательского преобразования для java.util.Введите дату следующим образом:

     @Bean
    @Override
    public ElasticsearchCustomConversions elasticsearchCustomConversions() {
        return new ElasticsearchCustomConversions(Arrays.asList(new DateToElasticStringFormat()));
    }

    @WritingConverter
    static class DateToElasticStringFormat implements Converter<Date, String> {

        @Override
        public String convert(Date source) {
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZZ");
            String dateString = format.format(source);
            return dateString;
        }
    }
 

Теперь elastic распознает даты.