文章目录
- ElasticSearch Script基础介绍
- 基础用法
- List类型数据新增、删除
- nested数据新增、删除
- 根据指定条件修改数据
- 根据指定条件修改多个字段数据-查询条件也使用脚本
- 根据指定条件删除nested中子数据
- 数据
- 根据条件删除数据
- 删除之后结果
- 创建脚本,通过脚本调用
- 根据条件查询出数据,删除nested子对象数据
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": "不返回具体数据。"
}
}
}
}