弹簧启动弹性-设置默认日期格式



我们想开始在elastic中存储一个非常大的类层次结构。

我们用@Document标记它们的基类这样我们就可以将整个层次结构存储在elastic

中很多类都有java.util.Date字段。

不幸的是,这些字段的默认映射是Long松紧带上的数字。(我们使用spring-boot-start -data-elasticsearch 2.4.2)

当我们用注释标记这些字段时,问题就解决了:
@Field(type = FieldType.Date,format = DateFormat.date_time)

是否有一种默认的方式可以将这种默认格式设置为层次结构中的所有映射?我们希望避免遍历数百个类,并使用此注释标记它们的字段。

我不太熟悉w/spring-boot,但一般来说,如果我有很多已知名称模式的日期字段,我设置一个regex动态模板:

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"
}

它们的映射是动态建立的。

那么w/

是可验证的
GET myindex/_mapping

通过添加java.util.Date类型的自定义转换修复了格式问题,如下所示:

@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可以识别日期了

最新更新