【发布时间】:2020-04-03 09:32:26
【问题描述】:
我正在使用 SpringBoot 2.2.5 和 Elasticsearch 6.8.6。我正在从 Spring Data Jest 迁移到使用带有 ElasticsearchEntityMapper 的 Spring Data Elasticsearch REST 传输机制。
我有一个Date 字段,其定义如下:
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
@Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
private Date date;
我希望像这样存储在 Elasticsearch 中的日期:
"date": "2020-04-02T14:49:05.672+0000"
当我启动应用程序时,会创建索引,但是当我尝试保存实体时出现以下异常:
Caused by: org.elasticsearch.client.ResponseException: method [POST], host [http://localhost:9200], URI [/trends/estrend?timeout=1m], status line [HTTP/1.1 400 Bad Request]
{"error":{"root_cause":[{"type":"mapper_parsing_exception","reason":"failed to parse field [date] of type [date] in document with id 'rS5UP3EB9eKtCTMXW_Ky'"}],"type":"mapper_parsing_exception","reason":"failed to parse field [date] of type [date] in document with id 'rS5UP3EB9eKtCTMXW_Ky'","caused_by":{"type":"illegal_argument_exception","reason":"Invalid format: \"1585905425266\" is malformed at \"5266\""}},"status":400}
关于我做错了什么以及我应该做些什么来解决它的任何指针?
下面的配置和实体定义:
@Configuration
public class ElasticsearchConfig extends AbstractElasticsearchConfiguration {
@Value("${spring.data.elasticsearch.host}")
private String elasticSearchHost;
@Value("${spring.data.elasticsearch.port}")
private String elasticSearchPort;
@Bean
public RestHighLevelClient elasticsearchClient() {
final ClientConfiguration clientConfiguration = ClientConfiguration.builder()
.connectedTo(elasticSearchHost + ":" + elasticSearchPort)
.usingSsl()
.build();
return RestClients.create(clientConfiguration).rest();
}
@Bean
public EntityMapper entityMapper() {
ElasticsearchEntityMapper entityMapper = new ElasticsearchEntityMapper(elasticsearchMappingContext(), new DefaultConversionService());
entityMapper.setConversions(elasticsearchCustomConversions());
return entityMapper;
}
}
package com.es.test;
import java.util.Date;
import java.util.UUID;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.DateFormat;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
@Document(indexName = "trends")
public class EsTrend {
@Id
private UUID id;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
@Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
private Date date;
private String entityOrRelationshipId;
// getter and setters
}
更新:
如果我禁用 ElasticsearchEntityMapper bean,我不会收到异常,并且日期会以正确的格式写入 Elasticsearch。我还需要为ElasticsearchEntityMapper 配置什么吗?
【问题讨论】:
-
您的日期字段映射如何?还是您使用动态映射,这意味着您之前没有为索引设置显式映射?
-
使用本站unixtimestamp.com将错误信息中指出的unix时间戳转换为 52225-05-05T20:47:46+00:00 。所以你的输入数据有问题。
-
我依赖动态映射。
-
测试我正在使用
trend1.setDate(new Date());不知道为什么会失败。 -
没有
@JsonFormat注解可以再试一次吗?
标签: elasticsearch date-format spring-data-elasticsearch