脚本语法是:
"script": {
"lang": "xxx",
"source" | "id": "xxx",
"params": {xxx}
}
lang是language的意思,指定脚本是用哪种语言写的,值可以是painless、expression,默认是painless。
source用于指定脚本,id用于指定我们自己预定义的脚本。
params用于指定在脚本中使用的参数。es在每次遇到新脚本时,会将该脚本编译并缓存起来,而编译是一个相对耗时的操作。所以,如果脚本只是参数值不同,建议使用params,而不是把参数值在脚本中写死。
脚本可以用在很多地方,如update、update_by_query、reindex、script query、script-based sorting、aggregation。
update示例:
post /indicator_item/_doc/1/_update?pretty
{
"script" : {
"source": "ctx._source.type++"
}
}
缩写如下:
post /indicator_item/_doc/1/_update
{
"script" : "ctx._source.type++"
}
update_by_query示例:
post /indicator_item/_update_by_query
{
"script": {
"source": "ctx._source.type++",
"lang": "painless"
},
"query": {
"term": {
"id": 1
}
}
}
script_fields
返回一个新的自定义的字段,字段值可以由其他字段值糅合产生。
script query
get /indicator_item/_search
{
"query":{
"script": {
"script" : {
"source": "doc['name'].value.length() <= params.param1",
"lang": "painless",
"params": {
"param1":1
}
}
}
}
}
doc是个关键字,表示文档。name指的是name字段,value是个关键字,指的是字段的值,length()是java.lang.String的length()方法。把length()方法的括号去掉,让es执行报错,看报错信息就明白了。所以说,还可以用String的其他方法,如substring()方法,如下:
get /indicator_item/_search
{
"query":{
"script": {
"script" : {
"source": "doc['name'].value.trim().toUpperCase().contains(params.param1)",
"lang": "painless",
"params": {
"param1":"RBC"
}
}
}
}
}