elasticSearch插入Date类型数据时报Invalid format

10月 24, 2016 |

我使用的elasticSearch Server版本为2.3.3,java客户端为2.2.0, entity的注解如下。

@Field(type=FieldType.Date, format=DateFormat.date_optional_time,index= FieldIndex.not_analyzed)
private Date createTime;

报如下异常。

MapperParsingException[failed to parse [createTime]]; nested: IllegalArgumentException[Invalid format: "1477322607562" is malformed at "7562"];
"createTime" : {
"type" : "date",
"format" : "date_optional_time"
}

谷歌后发现,是jackson库在转换为json的时候,将Date类型转为为了long型的字符串表示,而我们定义的是date_optional_time格式的字符串,所以解析错误,具体的解决办法为:

1、去掉注解中的format=DateFormat.date_optional_time
让其使用默认的格式,也就是'strict_date_optional_time||epoch_millis',既能接受date_optional_time格式的,也能接受epoch_millis格式。

@Field(type=FieldType.Date, index= FieldIndex.not_analyzed)
private Date createTime;
"createTime" : {
"type" : "date",
"format" : "strict_date_optional_time||epoch_millis"
},

2、添加@JsonFormat注解

@Field(type=FieldType.Date, format=DateFormat.date_optional_time, index= FieldIndex.not_analyzed)
@JsonFormat (shape = JsonFormat.Shape.STRING, pattern ="yyyy-MM-dd'T'HH:mm:ssZ")
private Date createTime;

有了这个注解后,jackson库会将Date类型序列化成指定的格式,而不是long性的字符串表示

Posted in: ElasticSearch

Comments are closed.