Elasticsearch java bulk upsert异常

时间:2015-09-01 10:20:04

标签: java exception elasticsearch upsert bulkupdate

我正在尝试使用批量API批量更新现有索引,因此存在一些需要更新的记录,一些是新的,需要进行索引,因为它们不在那里。我使用了以下代码

BulkRequestBuilder bulkRequestBuilder = client.prepareBulk();
bulkRequestBuilder.add(client.prepareUpdate(InvokeMain.indexName, type, docId).setUpsert(finalMap));

然而,有了这个,我得到以下异常

org.elasticsearch.action.ActionRequestValidationException: Validation      
Failed: script or doc is missing;

我猜测新记录/新docIds是失败的地方。任何想法如何实现upsert(如果存在则更新,如果不存在则更新)?

2 个答案:

答案 0 :(得分:2)

BulkRequestBuilder bulkRequestBuilder = client.prepareBulk();
bulkRequestBuilder.add(client.prepareUpdate(InvokeMain.indexName, type, docId).setDoc(finalMap).setUpsert(finalMap));

答案 1 :(得分:0)

使用upsert(即setUpsert)时,您的finalMap需要与described in the official docs略有不同,即它必须包含doc(您的情况) )或script(因此验证错误表明缺少scriptdoc):

...
Map<String, Object> docMap = ... your current map containing the fields...;
Map<String, Object> finalMap = new HashMap<String, Object>();
finalMap.put("doc", docMap);
...