繁体   English   中英

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

[英]Spring boot elastic - set default date format

我们想开始将一个非常大的类层次结构存储到弹性中。

我们用@Document注释标记了他们的基础 class 以便我们可以将整个层次结构存储在弹性中

那里的许多类都有java.util.Date字段。

不幸的是 - 这些字段的默认映射是弹性的数字。 (我们使用spring-boot-starter-data-elasticsearch 2.4.2

当我们用注解标记这些字段时,问题就解决了:

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

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

我不太熟悉 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

通过为 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;
        }
    }

现在弹性识别日期。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM