弹性搜索,Java API:验证失败:1:脚本或文档丢失;

Bla*_*ite 3 java elasticsearch

我试图在我的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
Run Code Online (Sandbox Code Playgroud)

它引发和错误

"java.util.concurrent.ExecutionException: 
org.elasticsearch.action.ActionRequestValidationException: Validation 
Failed: 1: script or doc is missing;"
Run Code Online (Sandbox Code Playgroud)

当我注释掉UpdateRequest代码并进行简单插入时,它的行为正确。

这里发生了什么?之所以这样做,是因为我想避免必须阅读ES 上可能存在的所有文档,然后再执行插入或更新周期。

对此问题的任何帮助将不胜感激。

Bla*_*ite 7

这是正确的版本,即不会引发错误的代码:

    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();
Run Code Online (Sandbox Code Playgroud)

一旦我添加了@alfasin建议中的“ updateRequest.doc”行,它就会像魅力一样起作用。