【问题标题】:Elastic search Update by Query to Update Complex Document弹性搜索通过查询更新以更新复杂文档
【发布时间】:2016-07-29 11:32:40
【问题描述】:

我有一个使用弹性搜索来更新文档的用例。

我的文档是这样的-

{
"first_name" : "firstName",
"last_name" : "lastName",
"version"  : 1234,
"user_roles" : {
   "version" : 12345,
    "id" : 1234, 
    "name" : "role1"},
},
"groups" : {
  "version" : 123,
 "list": [
 {"id":123, "name" : "ashd"},
 {"id":1234, "name" : "awshd"},
]
}

}

现在根据一些提要,我将更新父文档或更新嵌套文档。

我能够找到如何更新名字和姓氏等基本属性,但无法获得如何更新复杂/嵌套的属性

我从 REST 客户端做了类似的事情-

"script": {
    "inline": "ctx._source.user_roles = { "id" : 5678, "name" :"hcsdl"}
    }

但它给了我例外-

实际用例- 我实际上会在java中得到一个地图。 该键可以是简单键,如“first_name”,也可以是复杂键,如“user_role”和“groups” 我想使用按版本查询更新来更新文档。

我写的代码有点像-

for (String key : document.keySet()) {

            String value = defaultObjectMapper.writeValueAsString(document.get(key));

            scriptBuilder.append("ctx._source.");
            scriptBuilder.append(key);
            scriptBuilder.append('=');
            scriptBuilder.append(value);
            scriptBuilder.append(";");
        }

其中文档是地图 现在我可能会得到要更新的简单字段或复杂对象。 我尝试提供 user_roles.id 和 user_roles.name 之类的密钥,还尝试提供完整的 user_roles,但没有任何效果。

谁能帮忙

【问题讨论】:

  • 你得到什么异常?您可能需要转义双引号。

标签: elasticsearch groovy


【解决方案1】:

在脚本中使用 groovy 地图而不是逐字 JSON 试试这个:

"script": {
   "inline": "ctx._source.user_roles = [ 'id' : 5678, 'name' : 'hcsdl']}
}

【讨论】:

  • 嘿 Val,是的,上面的语法有效,但我正在寻找通用的东西,可以使用 ReindexPlugin 插件通过 Java 代码完成。我已经更新了确切的用例
  • 嗨 Val,你有机会处理更新后的问题吗?
猜你喜欢
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 2016-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-18
  • 1970-01-01
相关资源
最近更新 更多