spring-boot-elastic-set默认日期格式

k2arahey  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(277)

我们希望开始将一个非常大的类层次结构存储到elastic中。
我们用@document annotation标记了它们的基类,这样就可以将整个层次结构存储在elastic中
那里的许多类都有java.util.date字段。
不幸的是,这些字段的默认Map是elastic上的一个长数字(我们使用spring boot starter数据(elasticsearch 2.4.2)
当我们用注解标记这些字段时,问题就解决了:

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

有没有一种默认方法可以将此默认格式设置为层次结构中的所有Map?我们希望避免使用这个注解来标记数百个类的字段。

vfwfrxfs

vfwfrxfs1#

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

它们的Map是动态建立的。
这是可以验证的/

GET myindex/_mapping
wnavrhmk

wnavrhmk2#

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

现在弹性体识别日期。

相关问题