参考: https://www.jianshu.com/p/66a72d7ba3da
script格式
语法都遵循相同的模式
"script": {
"lang": "...",
"source" | "id": "...",
"params": { ... }
}
其中三要素功能如下
-
lang
:指定编程语言,默认是painless
,还有其他编程语言选项如expression
等 [popexizhi: 不加"lang":"painless" 是可以的,但还是加了比较安全:) ] -
source | id
: source,id二者选其一,source后面接inline脚本(就是将脚本逻辑直接放在DSL里面),id对应一个stored脚本(就是预先设置类似UDF,使用的时候根据UDF的id进行调用和传参) -
params
:在脚本中任何有名字的参数,用params传参数
(1)使用inline的方式将脚本写在DSL里面
POST /hotel/_doc/100/_update
{
"script": {
"source": "ctx._source.price=333"
}
}
【popexizhi:不了解ctx._source的原因,这样看应该是painless的语法要求】
注意在kibiban客户端带上_update
,否则相当于覆盖整个文档,新建了一个含有script字段的文档。本例中将price字段修改为333,如果是带有单引号的'333'则修改为字符串数据,字符串还可以使用\转义
POST /hotel/_doc/100/_update
{
"script": {
"source": "ctx._source.price=\"333\""
}
}
获取字段的方式除了使用ctx._source.字段
之外,还可以ctx._source['字段']
[popexizhi:这个是xpath用法,回头可以试试]
POST /hotel/_doc/100/_update
{
"script": {
"source": "ctx._source['price']=333"
}
}
只要inline脚本中的内容出现些许不一样就需要重新编译,因此推荐的方法是把inline中固定的部分编译一次,变量命名放在params中传参使用,这样只需要编译一次,下次使用调用缓存
[popexizhi:开始不是很理解这个params 的原因,这样理解了本质还是painless 的使用]
POST /hotel/_doc/100/_update
{
"script": {
"source": "ctx._source.price=params.price",
"params": {
"price": 334
}
}
}
没有评论:
发表评论