当前位置: 首页 > 面试题库 >

如何通过Java API更新Elasticsearch 2.2脚本中的嵌套对象

郑光济
2023-03-14
问题内容

我正在尝试使用类似于此处概述的技术,通过Java
API在Elasticsearch中更新嵌套对象。问题是如何将json传递到脚本中。如果我只是像这里建议的那样盲目地将json连接到脚本字符串,则Groovy无法编译。如果直接将其作为参数传递,则只会将其解析为字符串。如果我尝试使用JsonSlurper,例如:

String script = "ctx._source.pete = new groovy.json.JsonSlurper().parseText(json)";
Map<String, Object> params = ImmutableMap.of("json", json);
return new Script(script, ScriptService.ScriptType.INLINE, null, params);

我收到一个编译异常:无法解析类groovy.json.JsonSlurper

JsonSlurper方法的另一个问题似乎是,Elasticsearch团队基本上已在2.2中禁用了它。

有谁知道如何通过Java API正确传递json?


问题答案:

感谢Elasticsearch的人员为我提供的帮助。答案是将JSON转换为Map,然后仅将Map用作参数:

String script = "ctx._source.pete = jsonMap";
Map<? ,?> jsonMap = new ObjectMapper().readValue(json, HashMap.class);
Map<String, Object> params = ImmutableMap.of("jsonMap", jsonMap);
return new Script(script, ScriptService.ScriptType.INLINE, null, params);

org.codehaus.jackson.map.ObjectMapper用来做从JSON到的转换Map



 类似资料:
  • 假设我们有以下集合,我对此没有什么问题: > 我想增加“item_name”的价格:“my_item_two”,如果它不存在,应该将它追加到“items”数组中。

  • 我正在尝试更新MongoDB中嵌套对象中的一个键值。目前,我的做法是覆盖整个嵌套对象,我如何改变一个键-值对?

  • 问题内容: 我想在每个更新时间将一个对象添加到字段中。 例如,我有一个文档: 下次,我想在测试字段中添加一个对象并保存旧对象。结果是: 如何实现? 编辑 我使用脚本: 但是,我得到了例外: 编辑 现在,我想添加一个字段以确保更新或插入对象。例如: 当我更新字段时,当id存在时,我将更新对象。相反,我将插入对象。 问题答案: 我建议尝试这样的脚本,该脚本在参数中带有两个参数。它将检查任何嵌套对象是否

  • 问题内容: 我有一个带有JSONB列的表,其中包含类似 我想向匹配=和=的JSON对象添加一个新的JSON条目(),这将导致 以下查询返回符合过滤器要求 的JSON对象 : 我现在的问题是,我不知道如何将新条目添加到特定对象。我尝试了类似的东西 但这不会像未知列那样执行。在分配给之前,我还确实需要将的结果与其余的合并,因为否则会覆盖整个内容。 如何根据过滤条件更新特定的深层嵌套JSON对象?如果我

  • 谁能告诉我我在这里做错了什么?从console.log,我可以看到日期功能正在正常工作。但是,即使在之后,时间戳也不会更新。提前感谢!

  • 我需要更新嵌套在我的用户文档中的一个字段,该字段包含一个part对象数组,以添加新的part。一个part对象如下所示: 所以这意味着$addToset对我的情况没有好处...现在我不知道该怎么办。