es 脚本及脚本查询

脚本语法是:

"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"
                }
            }
        }
    }
}

原文地址:https://www.cnblogs.com/koushr/p/5873409.html