我有弹性搜索的用例来更新文档。
我的文档是这样的 -
{
"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,但没有任何工作。
有人可以提供帮助
答案 0 :(得分:0)
尝试使用groovy贴图而不是脚本中的逐字JSON:
"script": {
"inline": "ctx._source.user_roles = [ 'id' : 5678, 'name' : 'hcsdl']}
}