1

我正在尝试使用批量 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(如果存在则更新,如果不存在则插入)?

4

2 回答 2

2
BulkRequestBuilder bulkRequestBuilder = client.prepareBulk();
bulkRequestBuilder.add(client.prepareUpdate(InvokeMain.indexName, type, docId).setDoc(finalMap).setUpsert(finalMap));
于 2016-04-26T09:37:19.107 回答
0

使用upsert(ie setUpsert) 时,您finalMap需要与官方文档中描述的稍有不同,即它必须包含doc(您的案例) 或script(因此验证错误说明scriptordoc缺失):

...
Map<String, Object> docMap = ... your current map containing the fields...;
Map<String, Object> finalMap = new HashMap<String, Object>();
finalMap.put("doc", docMap);
...
于 2015-09-01T13:33:58.967 回答