elasticsearch nested 增删改(转载)
原文地址:ES nested 数组元素增删改查_es对数组里的元素查询__细水长流的博客-CSDN博客
参考地址:es nested数组嵌套对象操作 增删改查 - meow_world - 博客园 (cnblogs.com)
- 定义缓存结构体(重点关注nested):
PUT group/_mapping { "properties": { "id": { "type": "long" }, "name": { "type": "text" }, "members": { "type": "nested", "properties": { "id": { "type": "long" }, "name": { "type": "text" } } } } }
- 初始化缓存数据
PUT group/_doc/1 { "id": 1, "name": "Group1" } PUT group/_doc/2 { "id": 2, "name": "Group2", "members": [ { "id": 3, "name": "王五" } ] }
- 在Group1的members(nested数组)中增加一个成员:郑十
POST group/_update/1 { "script": { "source": """ if (ctx._source.members == null) { List ls = new ArrayList(); ls.add(params.member); ctx._source.members = ls; } else { ctx._source.members.add(params.member); } """, "lang": "painless", "params": { "member": { "id": 10, "name": "郑十" } } } } 【注意】: 务必增加if判断,因为member在doc创建时并没有该字段的值,故该字段此时为null,不能直接通过add追加元素,而应创建一个List并赋值过去。 # 确认member已增加: GET group/_doc/1 { ... "_source" : { "id" : 1, "name" : "Group1", "members" : [ { "name" : "郑十", "id" : 10 } ] } }
- 在Group1的members(nested数组)中删除一个成员:id=10
POST group/_update/1 { "script": { "source": "ctx._source.members.removeIf(list_item -> list_item.id == params.member_id)", "lang": "painless", "params": { "member_id": 10 } } } # 确认member已删除: GET group/_doc/1 { ... "_source" : { "id" : 1, "name" : "Group1", "members" : [ { "id" : 1, "name" : "张三" }, { "id" : 2, "name" : "李四" } ] } }
- 在Group1的members(nested数组)中更新id=1的member.name为张三1
POST group/_update/1
{
"script": {
"source": "for (item in ctx._source.members) {if(item['id']==params.member_id){item['name']=params.name_new}}",
"lang": "painless",
"params": {
"member_id":1,
"name_new": "张三1"
}
}
}
# 确认member已更新:
GET group/_doc/1
{
...
"_source" : {
"id" : 1,
"name" : "Group1",
"members" : [
{
"id" : 1,
"name" : "张三1"
},
{
"id" : 2,
"name" : "李四"
}
]
}
}
#批量修改文档 POST group/_update/5kG_5H8BmwYplCYFsIYV
{
"script": {
"source": "for(def i=0;i<params.update.length;i++)
{
for (item in ctx._source.user)
{
if (item['userId'] == params.update[i].userId)
{
item['userName'] = params.update[i].userName;
item['content'] = params.update[i].content
}
}
}",
"lang": "painless",
"params": {
"update":[
{ "userId":"4005", "userName": "小闫2", "content":"update" },
{ "userId":"4006", "userName": "小闫3", "content":"update" }
]
}
}
}
- 查询含有id=1的member的Group(重点关注nested):
GET group/_search { "query": { "nested": { "path": "members", "query": { "bool": { "must": [ { "match": { "members.id": 1 } } ] } } } } } # 查询结果: { ... "hits" : { ... "hits" : [ { "_index" : "group", "_type" : "_doc", "_id" : "1", "_score" : 1.0, "_source" : { "id" : 1, "name" : "Group1", "members" : [ { "id" : 1, "name" : "张三1" }, { "id" : 2, "name" : "李四" } ] } } ] } }