html tool

2024年4月29日星期一

转:es的script--painless

参考: 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
        }
    }
}





没有评论:

发表评论