使用ElasticSearch的script_upsert创建文档

Roe*_*rel 5 java upsert elasticsearch elasticsearch-java-api

根据官方文档Update API-Upserts,可以使用scripted_upsert该脚本处理脚本中的更新(对于现有文档)或插入(对于新文档)表格。问题是它们从不显示脚本应如何执行此操作。在爪哇-更新API没有对ScriptUpsert用途的任何信息。

这是我正在使用的代码:

//My function to build and use the upsert
public void scriptedUpsert(String key, String parent, String scriptSource, Map<String, ? extends Object> parameters) {
    Script script = new Script(scriptSource, ScriptType.INLINE, null, parameters);
    UpdateRequest request = new UpdateRequest(index, type, key);
    request.scriptedUpsert(true);
    request.script(script);
    if (parent != null) {
        request.parent(parent);
    }
    this.bulkProcessor.add(request);
}

//A test call to validate the function
String scriptSource = "if (!ctx._source.hasProperty(\"numbers\")) {ctx._source.numbers=[]}";
Map<String, List<Integer>> parameters = new HashMap<>();
List<Integer> numbers = new LinkedList<>();
numbers.add(100);
parameters.put("numbers", numbers);

bulk.scriptedUpsert("testUser", null, scriptSource, parameters);
Run Code Online (Sandbox Code Playgroud)

当“ testUser”文档不存在时,出现以下异常:
DocumentMissingException[[user][testUser]: document missing

如何通过Java代码使scriptUpsert工作?

And*_*fan 7

scripted_upsert命令(及其脚本)应如下所示:

POST /sessions/session/1/_update
{
  "scripted_upsert": true,
  "script": {
    "inline": "if (ctx.op == \"create\") ctx._source.numbers = newNumbers; else ctx._source.numbers += updatedNumbers",
    "params": {
      "newNumbers": [1,2,3],
      "updatedNumbers": [55]
    }
  },
  "upsert": {}
}
Run Code Online (Sandbox Code Playgroud)

如果您调用上述命令并且索引不存在,它将创建它以及newNumbers新文档中的值。如果您再次调用完全相同的命令,numbers值将变为1,2,3,55

就你而言,你缺少"upsert": {}一部分。