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

时间:2017-08-30 04:20:44

标签: 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

它引发错误

"java.util.concurrent.ExecutionException: 
org.elasticsearch.action.ActionRequestValidationException: Validation 
Failed: 1: script or doc is missing;"

当我注释掉UpdateRequest代码并使用普通插入时,它的行为正确。

这里发生了什么?我这样做是因为我想避免阅读ES上存在可能的所有文档,然后进行插入或更新循环。

非常感谢任何有关问题的帮助。

3 个答案:

答案 0 :(得分:4)

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

    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();

我添加" updateRequest.doc"来自@alfasin的建议,它就像一个魅力。

答案 1 :(得分:1)

可能有用。我遇到了这个问题并自行解决。想到共享就降落在这里。

与上述类似,但IndexRequest和docAsUpsert除外(如果存在,则更新doc,否则创建一个)。如果不存在,还为firstime创建索引。

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));

答案 2 :(得分:0)

下面的代码应该不会抛出异常。

  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();