【问题标题】:Elasticsearch error: failed to parse, document is emptyElasticsearch 错误:解析失败,文档为空
【发布时间】:2026-01-25 21:05:02
【问题描述】:

当我尝试索引一个简单的 JSON 文档时,我在 Elasticsearch (0.90) API 中收到此错误。

代码如下:

TransportClient client = new TransportClient().addTransportAddress(new InetSocketTransportAddress("localhost", 9300));
String indexName = "searchwriter-" + FORMAT.format(System.currentTimeMillis());
client.prepareIndex(indexName, "trace", String.valueOf(id++)).setOpType(IndexRequest.OpType.INDEX).setSource(inputLine).execute().actionGet();
上述代码中的

inputLine不为空。它的值为

{"type":"MasterCard1","name":"Zaheen1"}

以下例外:

[2013-12-10 11:26:24,475][DEBUG][action.index][Foxfire][searchwriter-2013-12-10][0],节点[Hamh7CPnQIqqp4pYA-DD9w],[P],s[开始]: 无法执行 [index {[searchwriter-2013- 12-10][踪迹][2],来源[_na_]}] org.elasticsearch.index.mapper.MapperParsingException:解析失败,文档为空 在 org.elasticsearch.index.mapper.DocumentMapper.parse(DocumentMapper.java:530) 在 org.elasticsearch.index.mapper.DocumentMapper.parse(DocumentMapper.java:452) 在 org.elasticsearch.index.shard.service.InternalIndexShard.prepareIndex(InternalIndexShard.java:341) 在 org.elasticsearch.action.index.TransportIndexAction.shardOperationOnPrimary(TransportIndexAction.java:203) 在 org.elasticsearch.action.support.replication.TransportShardReplicationOperationAction$AsyncShardOperationAction.performOnPrimary(TransportShardReplicationOperationAction.java:533) 在 org.elasticsearch.action.support.replication.TransportShardReplicationOperationAction$AsyncShardOperationAction$1.run(TransportShardReplicationOperationAction.java:418) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 在 java.lang.Thread.run(Thread.java:724)

我用谷歌搜索,但我找不到原因。有什么想法吗?

【问题讨论】:

  • 应该在您发送的 json 文档中输入吗?您是否尝试过像 ES 示例中那样使用 XContentBuilder 设置源? setSource(jsonBuilder() .startObject() .field("user", "kimchy") .field("postDate", new Date()) .field("message", "trying out Elastic Search") .endObject() inputline 是不是一个 json 字符串,如果是,是否需要转义?

标签: java json elasticsearch


【解决方案1】:

应该可以。所以,我猜inputLine 不包含您认为它包含的内容。尝试用硬编码版本替换您的 inputLine

client.prepareIndex(indexName, "trace", String.valueOf(id++)).setOpType(IndexRequest.OpType.INDEX).setSource("{\"type\":\"MasterCard1\",\"name\":\"Zaheen1\"}").execute().actionGet();

看看它是否解决了这个问题。

以防万一,您是否在客户端和服务器上使用相同版本的 elasticsearch?

【讨论】: