java - 使用 ElasticSearch 的 script_upsert 创建文档

标签 java elasticsearch upsert elasticsearch-java-api

根据官方文档Update API - Upserts可以使用 scripted_upsert 来处理脚本中的更新(对于现有文档)或插入(对于新文档)表单。问题是他们从不展示脚本应该如何做到这一点。 Java - Update 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);

当“testUser”文档不存在时,我得到以下异常:
DocumentMissingException[[user][testUser]: 文档丢失

如何使 scriptUpsert 从 Java 代码运行?

最佳答案

这是 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": {}
}

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

在您的情况下,您缺少 "upsert": {} 部分。

关于java - 使用 ElasticSearch 的 script_upsert 创建文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38719549/

相关文章:

elasticsearch - 如何监控 ElasticSearch 中的所有 CircuitBreaker

elasticsearch - 如何在elasticsearch中搜索标签

SQLite - UPSERT *不是* INSERT 或 REPLACE

c# - 避免在 Azure 表存储中进行新的更新插入

java 如何将 int[][] 转换为 BufferedImage

java - 在 jLabel 上调整图像大小

java - Google TV - 效率设计是否与手机/平板电脑一样重要?

elasticsearch - 通过代理在公司防火墙后面的Elasticsearch RestHighLevelClient

solr - SOLR 可以执行 UPSERT 吗?

java - Android解析查询2个类