Elasticsearch高山docker与jdk8 java.time.Instant导致epochSecond错误

我最近尝试了2.4.6-alpine,将java.util.Date更改为JDK 8 java.time.Instant

日志文档正在使用弹簧引导自动注入。

 import java.time.Instant; @Document(indexName = "log") public class Log { @Id private String id; @Field(type = FieldType.Date, store = true) private Instant timestamp = null; ... 

以前的日志文档看起来像这样。

 import java.util.Date; @Document(indexName = "log") public class Log { @Id private String id; @Field(type = FieldType.Date, store = true) private Date timestamp = null; 

在ES 2.4.6-alpine中使用java.util.Date和ES 2.4.6使用java.time.Instant ,我没有任何问题。

但是,在ES 2.4.6-alpine with java.time.Instant ,我看到以下错误。 这似乎是与高山linux和java.time格式的问题。

  SEVERE: Servlet.service() for servlet [dispatcherServlet] in context with path [/v1] threw exception [Request processing failed; nested exception is MapperParsingException[failed to parse [timestamp]]; nested: IllegalArgumentException[unknown property [epochSecond]];] with root cause java.lang.IllegalArgumentException: unknown property [epochSecond] at org.elasticsearch.index.mapper.core.DateFieldMapper.innerParseCreateField(DateFieldMapper.java:520) at org.elasticsearch.index.mapper.core.NumberFieldMapper.parseCreateField(NumberFieldMapper.java:241) at org.elasticsearch.index.mapper.FieldMapper.parse(FieldMapper.java:321) at org.elasticsearch.index.mapper.DocumentParser.parseObjectOrField(DocumentParser.java:311) at org.elasticsearch.index.mapper.DocumentParser.parseObject(DocumentParser.java:328) at org.elasticsearch.index.mapper.DocumentParser.parseObject(DocumentParser.java:254) at org.elasticsearch.index.mapper.DocumentParser.parseDocument(DocumentParser.java:124) at org.elasticsearch.index.mapper.DocumentMapper.parse(DocumentMapper.java:309) at org.elasticsearch.index.shard.IndexShard.prepareCreate(IndexShard.java:533) at org.elasticsearch.index.shard.IndexShard.prepareCreateOnPrimary(IndexShard.java:510) at org.elasticsearch.action.index.TransportIndexAction.prepareIndexOperationOnPrimary(TransportIndexAction.java:214) at org.elasticsearch.action.index.TransportIndexAction.executeIndexRequestOnPrimary(TransportIndexAction.java:223) at org.elasticsearch.action.index.TransportIndexAction.shardOperationOnPrimary(TransportIndexAction.java:157) at org.elasticsearch.action.index.TransportIndexAction.shardOperationOnPrimary(TransportIndexAction.java:66) at org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryPhase.doRun(TransportReplicationAction.java:657) at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37) at org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryOperationTransportHandler.messageReceived(TransportReplicationAction.java:287) at org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryOperationTransportHandler.messageReceived(TransportReplicationAction.java:279) at org.elasticsearch.transport.RequestHandlerRegistry.processMessageReceived(RequestHandlerRegistry.java:77) at org.elasticsearch.transport.TransportService$4.doRun(TransportService.java:378) at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) 

任何build议使用java.time。*与阿尔卑斯elasticsearch?

docker-compose up -d命令后,当我curl -xGET localhost:9200/*我看到有一些初始数据。 这个数据甚至在-XDELETE-XDELETE docker-compose down-XDELETE docker-compose up -d命令之后回来。

弹性search的初始数据:2.4.6和elasticsearch:2.4.6-高山docker是一样的。

 { "log":{ "aliases":{}, "mappings":{ "log":{ "properties":{ "timestamp":{ "type":"date", "store":true, "format":"strict_date_optional_time||epoch_millis" } } } }, "settings":{ "index":{ "refresh_interval":"1s", "number_of_shards":"5", "creation_date":"1513716676662", "store":{ "type":"fs" }, "number_of_replicas":"1", "uuid":"qlj9xxxxxxxxxxxxxxoisA", "version":{ "created":"2040699" } } }, "warmers":{} } } 

啊。 初始数据在启动弹簧引导服务的自动注入在我的Elasticsearch实现中使用的日志文档类中填充。

在org.springframework.data.elasticsearch.annotation.DateFormat类的javadoc中find了很好的date – 时间格式的引用。 SOO很多时间格式与名称和没有匹配我的输出:(

http://nocf-www.elastic.co/guide/en/elasticsearch/reference/current/mapping-date-format.html

此错误通常是您提交格式与先前索引的文档冲突的文档的结果。 (如将date格式从javadate更改为java即时)

当您更改文档格式时,您需要清除ElasticSearch中的相应索引。

您可以使用DELETE API清除索引(您可以使用*清除所有类似的内容
curl -XDELETE localhost:9200/* )和GET API来validation一个干净的索引。
curl -XGET localhost:9200/* ,或者在浏览器中转到http:// localhost:9200 / * 。 {}表示你有一个空索引)

(这是假设你还没有尝试创build一个新的ES 2.4.6-高山testing。我已经看到其他人使用docker设置与其他东西恢复到“干净”设置没有实际上摆脱所有的旧数据)

为了得到这个与elasticsearch的工作:2.4.6-高山docker和我的弹簧引导1.5.9-RELEASE与自动注入,我不得不添加format = DateFormat.custom, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"format = DateFormat.custom, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"注释中。 显然,默认的org.springframework.data.elasticsearch.annotations.DateFormat.none不适用于运行在alpine上的elasticsearch。

它必须从阿尔派3.7操作系统获得一些不兼容的时间date格式,而不是CentOS操作系统。