我正在尝试在我的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”行,它就像一个魅力。