ElasticSearch Script 操作数据最详细介绍
文章目录
ElasticSearch Script基础介绍
语法
"script": {"lang": "...", "source" | "id": "...", "params": { ... } }
参数说明:
字段 | 说明 |
---|---|
lang | 脚本使用的语言,默认是painless |
source | 脚本的核心部分,id应用于:stored script |
params | 传递给脚本使用的变量参数 |
Script有许多场景使用,比如update、update-by-query、reindex等,结合scripts语法说,lang会有painless、expression、mustache等选择;source中有ctx、doc[‘field_name’]、_source等方式取值。
基础用法
List类型数据新增、删除
添加数据到List
PUT test/_doc/1{"counter" : 1,"tags" : ["red"]}
使用Script添加数据到List
POST test/_update/1{"script" : {"source": "ctx._source.tags.add(params.tag)","lang": "painless","params" : {"tag" : "blue"}}}
使用Script删除List数据
POST test/_update/1{"script": {"source": "if (ctx._source.tags.contains(params.tag)) { ctx._source.tags.remove(ctx._source.tags.indexOf(params.tag)) }","lang": "painless","params": {"tag": "blue"}}}
nested数据新增、删除
新增nested类型数据
POST group/_update/50Bh5H8BmwYplCYFGcvg
{"script" : {"source": "ctx._source.user.add(params.user)","lang": "painless","params": {"user": {"userId":"3005","userName":"小卡","content":"不返回具体数据。"}}}
}
删除nested类型数据
POST group/_update_by_query
{"script" : {"source": "ctx._source.user.removeIf(item -> item.userId == params.userId)","lang": "painless","params": {"userId": "3003"}},"query": {"term": {"user.content.keyword": {"value": "不返回具体数据。"}}}
}
根据指定条件修改数据
SQL含义:
update operator_ip_segment_index set owned_network = '广电网' where owned_network.keyword = '新疆伊犁哈萨克自治州';
DSL语法:
curl -XPOST http://8.9.60.9:9200/operator_ip_segment_index/_update_by_query -H 'Content-Type: application/json' -d'
{"script":{"source":"ctx._source.owned_network = params.owned_network","params":{"owned_network":"广电网"},"lang":"painless"},"query":{"term":{"owned_network.keyword":"新疆伊犁哈萨克自治州"}}
}
'
根据指定条件修改多个字段数据-查询条件也使用脚本
POST operator_ip_segment_index/_update_by_query
{"script":{"source":"""ctx._source['ip_type_code']=null;ctx._source['start_ipv4_num']=null;"""},"query": {"bool": {"should": {"script": {"script": {"source": """long times = System.currentTimeMillis()/1000 - 60 * 60 * 24;doc['update_time_seconds'].value <= times""", "lang": "painless"}}}}}
}
根据指定条件删除nested中子数据
数据
{"took" : 3,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 1,"relation" : "eq"},"max_score" : 0.8025915,"hits" : [{"_index" : "group","_type" : "_doc","_id" : "ri8VboYBHSuebtDIpIft","_score" : 0.8025915,"_source" : {"groupName" : "聊天2群","groupId" : "1002","user" : [{"userName" : "小王2","userId" : "3002","content" : "2作为一级筛选条件单独使用表示,表示只返回聚合结果,不返回具体数据。"},{"userName" : "小张2","userId" : "3003","content" : "2作为一级筛选条件单独使用表示,表示只返回聚合结果,不返回具体数据。"},{"userName" : "小卡","userId" : "说啥呢","content" : "不返回具体数据。"}]}}]}
}
根据条件删除数据
查询user.content.keyword = 不返回具体数据。
的数据,并删除,nested
中userId=3003
的子数据
POST group/_update_by_query
{"script" : {"source": "ctx._source.user.removeIf(item -> item.userId == params.userId)","lang": "painless","params": {"userId": "3003"}},"query": {"term": {"user.content.keyword": {"value": "不返回具体数据。"}}}
}
删除之后结果
{"took" : 3,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 1,"relation" : "eq"},"max_score" : 0.8025915,"hits" : [{"_index" : "group","_type" : "_doc","_id" : "ri8VboYBHSuebtDIpIft","_score" : 0.8025915,"_source" : {"groupName" : "聊天2群","groupId" : "1002","user" : [{"userName" : "小王2","userId" : "3002","content" : "2作为一级筛选条件单独使用表示,表示只返回聚合结果,不返回具体数据。"},{"userName" : "小卡","userId" : "说啥呢","content" : "不返回具体数据。"}]}}]}
}
创建脚本,通过脚本调用
根据条件查询出数据,删除nested子对象数据
创建删除脚本,id为delete-nested-test
POST _scripts/delete-nested-test
{"script":{"lang":"painless","source":"ctx._source.user.removeIf(item -> item.userId == params.userId)"}
}
使用delete-nested-test
脚本,删除nested,user.userId等于888
的子对象数据
POST group/_update_by_query
{"script": {"id":"delete-nested-test","params":{"userId":"888"}},"query": {"term": {"user.content.keyword": {"value": "不返回具体数据。"}}}
}