#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 распознает даты.