我正在尝试使用批量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(如果存在则更新,如果不存在则更新)?
答案 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
(因此验证错误表明缺少script
或doc
):
...
Map<String, Object> docMap = ... your current map containing the fields...;
Map<String, Object> finalMap = new HashMap<String, Object>();
finalMap.put("doc", docMap);
...