Painless execute API 允许执行任意脚本并返回结果。请注意的是:这个 API 是新的,请求方式及响应在未来可能会有所改变。
Context
Context 也即是上下文的意思。Context 控制了脚本如何执行,在运行时可以使用哪些变量,返回类型是什么。
Plainless test context
这是默认的 context。painless_test 上下文按原样执行脚本,并且不添加任何特殊参数。 唯一可用的变量是 params,可用于访问用户定义的值。 脚本的结果总是转换为字符串。 如果未指定上下文,则默认使用此上下文。
例子
我们发送如下的请求:
[code]POST /_scripts/painless/_execute{\"script\": {\"source\": \"params.count / params.total\",\"params\": {\"count\": 100.0,\"total\": 1000.0}}}
上面的响应结果为:
[code]{\"result\": \"0.1\"}
在上面,我们通过 params 把参数传入到 source 里进行执行,并返回结果。
Filter context
filter 上下文执行脚本的方式就像在脚本查询中执行脚本一样。 为了进行测试,必须提供一个文档,以便可以在内存中对其进行临时索引并可以从脚本中对其进行访问。 更准确地说,此类文档的 _source,存储的字段和 doc 值可用于正在测试的脚本。
可以在 context_setup 中为过滤器上下文指定以下参数:
- document:包含将在内存中临时建立索引并可以从脚本访问的文档。
- index:索引名称,其中包含与要编制索引的文档兼容的映射。
例子
[code]PUT /my-index-000001{\"mappings\": {\"properties\": {\"field\": {\"type\": \"keyword\"}}}}POST /_scripts/painless/_execute{\"script\": {\"source\": \"doc[\'field\'].value.length() <= params.max_length\",\"params\": {\"max_length\": 4}},\"context\": \"filter\",\"context_setup\": {\"index\": \"my-index-000001\",\"document\": {\"field\": \"four\"}}}
响应:
[code]{\"result\" : true}
在上面,我们首先定义了一个叫做 my-index-000001 的索引。由于我们使用了 filter 上下文,我们通过 context_setup 把相应的 index 及 document 进行定义。
Score context
Ccore 上下文将执行脚本,就像在 function_score 查询中的 script_score 函数中执行脚本一样。
可以在 context_setup 中为得分上下文指定以下参数:
- document:包含将在内存中临时建立索引并可以从脚本访问的文档。
- index:索引名称,其中包含与要编制索引的文档兼容的映射。
- query:如果在脚本中使用了 _score,则 query 可以指定它将用于计算分数。
例子
[code]PUT /my-index-000002{\"mappings\": {\"properties\": {\"field\": {\"type\": \"keyword\"},\"rank\": {\"type\": \"long\"}}}}POST /_scripts/painless/_execute{\"script\": {\"source\": \"doc[\'rank\'].value / params.max_rank\",\"params\": {\"max_rank\": 5.0}},\"context\": \"score\",\"context_setup\": {\"index\": \"my-index-000002\",\"document\": {\"rank\": 4}}}
响应:
[code]{\"result\" : 0.8}
参考:
【1】https://www.elastic.co/guide/en/elasticsearch/painless/current/painless-execute-api.html