今天碰到一个问题,就是我们要搜索一个日期字段,这个字段在elastic里的存储类型为text,导致搜索出现错误
type=illegal_argument_exception, reason=Text fields are not optimised for operations that require per-document
网上搜了一圈,各种解决方法都不管用。我想,既然这个字段是日期型的,我就用日期型存储在ES中,既少占空间,又能提高搜索效率,何乐而不为之?
于是,在logstash里添加一段,把文本转成日期类型:
date {
match => [ "logDate", "yyyy-MM-dd HH:mm:ss.SSS" ]
target => "logDate"
}
然后又按网上说的,在JAVA里对日期一顿注解:
@Field(type = FieldType.Date, format = DateFormat.date_optional_time)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern ="yyyy-MM-dd'T'HH:mm:ss.SSSZ",timezone="GMT+8")
private Date logDate;
测试一下,还是出错,说是什么日期格式问题,我又想,我java里也是日期型的,ES里也是日期型的,那么它不应该是全部自动搞定吗,为什么还要我注解这么多呢?
于是加到原点,去掉所有的注解:
private Date logDate;
一测试就成功了。原来真是应验了一句古话:大道至简!!!