我正在尝试在我的ES系统上执行UPSERT。当我在下面运行此代码时:
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(m);
String id = m.getId();
IndexRequest indexRequest = new IndexRequest("mediaitems", "mediaitem", m.getId())
.source(json);
UpdateRequest updateRequest =
new UpdateRequest("mediaitems", "mediaitem", m.getId()).upsert(indexRequest);
client.update(updateRequest).get(); //Throws error here
它抛出
的错误"java.util.concurrent.ExecutionException:
org.elasticsearch.action.ActionRequestValidationException: Validation
Failed: 1: script or doc is missing;"
当我评论UpdatereQuest代码并使用普通插入时,它的行为正确。
这里发生了什么?我之所以这样做,是因为我想避免阅读可能存在于ES上的所有文档,然后进行插入或更高的周期。
对问题的任何帮助都非常感谢。
这是正确的版本,即不会抛出代码的错误:
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(m);
String id = m.getId();
IndexRequest indexRequest = new IndexRequest("mediaitems", "mediaitem", m.getId())
.source(json);
UpdateRequest updateRequest =
new UpdateRequest("mediaitems", "mediaitem", m.getId()).upsert(indexRequest);
//Fix is the line below
updateRequest.doc(indexRequest);
client.update(updateRequest).get();
一旦我添加了@Alfasin建议的" Updaterequest.doc"行,它就像魅力一样工作。
可能很有用。我面对这个问题,并为自我而定。降落在这里,想到分享。
与上述类似,除了indexRequest和docasupsert(如果存在,则更新文档,否则会创建一个)。如果不存在的话,也会为第一时间创建索引。
byte[] bytes = mapper.writeValueAsBytes(datum);
UpdateRequest updateRequest = new UpdateRequest(topicName, "_doc", datum.getAccount_name()).doc(bytes, XContentType.JSON);
bulkProcessor.add(updateRequest);
//or
bulkProcessor.add(updateRequest.docAsUpsert(true));
以下代码应在不抛出异常的情况下工作。
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(m);
String id = m.getId();
UpdateRequest updateRequest =
new UpdateRequest("mediaitems", "mediaitem", m.getId())
.doc(m).docAsUpsert(true); //assign doc
client.update(updateRequest).get();