Elasticsearch:Painless execute API

Painless execute API 允许执行任意脚本并返回结果。请注意的是:这个 API 是新的,请求方式及响应在未来可能会有所改变。

Context

Context 也即是上下文的意思。Context 控制了脚本如何执行,在运行时可以使用哪些变量,返回类型是什么。

 

Plainless test context

这是默认的 context。painless_test 上下文按原样执行脚本,并且不添加任何特殊参数。 唯一可用的变量是 params,可用于访问用户定义的值。 脚本的结果总是转换为字符串。 如果未指定上下文,则默认使用此上下文。

例子

我们发送如下的请求:

POST /_scripts/painless/_execute
{
  "script": {
    "source": "params.count / params.total",
    "params": {
      "count": 100.0,
      "total": 1000.0
    }
  }
}

上面的响应结果为:

{
  "result": "0.1"
}

在上面,我们通过 params 把参数传入到 source 里进行执行,并返回结果。

 

Filter context

filter 上下文执行脚本的方式就像在脚本查询中执行脚本一样。 为了进行测试,必须提供一个文档,以便可以在内存中对其进行临时索引并可以从脚本中对其进行访问。 更准确地说,此类文档的 _source,存储的字段和 doc 值可用于正在测试的脚本。

可以在 context_setup 中为过滤器上下文指定以下参数:

  • document:包含将在内存中临时建立索引并可以从脚本访问的文档。
  • index:索引名称,其中包含与要编制索引的文档兼容的映射。

例子

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

响应:

{
  "result" : true
}

在上面,我们首先定义了一个叫做 my-index-000001 的索引。由于我们使用了 filter 上下文,我们通过 context_setup 把相应的 index 及 document 进行定义。

 

Score context

Ccore 上下文将执行脚本,就像在 function_score 查询中的 script_score 函数中执行脚本一样。

可以在 context_setup 中为得分上下文指定以下参数:

  • document:包含将在内存中临时建立索引并可以从脚本访问的文档。
  • index:索引名称,其中包含与要编制索引的文档兼容的映射。
  • query:如果在脚本中使用了 _score,则 query 可以指定它将用于计算分数。

例子

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

响应:

{
  "result" : 0.8
}

 

参考:

【1】https://www.elastic.co/guide/en/elasticsearch/painless/current/painless-execute-api.html