弹出搜索按查询更新以更新复杂文档

时间:2016-07-29 11:32:41

标签: elasticsearch groovy

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

我的文档是这样的 -

{
"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"},
]
}

}

现在取决于某些Feed,我将更新父文档或更新嵌套文档。

我能够找到如何更新firstName和lastName等基本属性但无法获取如何更新复杂/嵌套的属性

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

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

但它给了我例外 -

实际使用案例 - 我实际上将在java中获取Map。 此键可以是“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(";");
        }

其中document是Map 现在我可能会获得更新或复杂对象的简单字段。 我尝试过提供像user_roles.id和user_roles.name这样的密钥,并尝试提供完整的user_roles,但没有任何工作。

有人可以提供帮助

1 个答案:

答案 0 :(得分:0)

尝试使用groovy贴图而不是脚本中的逐字JSON:

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