【问题标题】:Spring boot elastic - set default date formatSpring Boot弹性 - 设置默认日期格式
【发布时间】:2021-01-27 10:05:44
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: java spring spring-boot elasticsearch spring-data-elasticsearch


    【解决方案1】:

    我不太熟悉 spring-boot,但一般来说,如果我有很多已知名称模式的日期字段,我会设置一个 regex dynamic template

    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
    

    【讨论】:

    • 这对于 Elasticsearch 部分来说没问题。并且仅写入 Elasticsearch 就足够了。但是 Spring Data Elasticsearch 也需要格式信息来将返回的文档解析为 Java 对象。
    【解决方案2】:

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

    现在弹性识别日期。

    【讨论】:

      猜你喜欢
      • 2017-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-03
      • 1970-01-01
      • 2013-10-09
      • 2011-02-19
      • 2016-08-01
      相关资源
      最近更新 更多