1、什么是 painless?

ElasticStack在升级到5.0版本之后,带来了一个新的脚本语言:painless。painless针对Elasticsearch的场景来进行优化,只做Elasticsearch数据的操作,更加轻量级,速度要快好几倍,并且支持Java静态类型,语法保持Groove类似,还支持Java的lambda表达式。painless脚本分为两种类型:inline script 和 stored script。前者仅仅写在api请求中,后者可以存储起来。如同sql和存储过程的区别。

2、painless语法模式

 "script": {
     "lang": "...", (1)
    "source" | "id": "...", (2)
    "params": { ... } (3)
}

(1)写入脚本的语言,默认为painless。
(2)脚本可以指定为 source 或者 id。inline script 使用 source ;而 stored script 使用 id。
(3)传递给脚本的命名参数。

3、painless 应用举例:简单表达式计算

第一步:建立文档,内含计算数值

PUT my-index-000001/_doc/1
{
  "my_field": 5
}

第二步:发起painless脚本,计算得数

GET my-index-000001/_search
{
  "script_fields": {
    "my_doubled_field": {
      "script": {
        "lang":   "expression",
        "source": "doc['my_field'] * multiplier",
        "params": {
          "multiplier": 2
        }
      }
    }
  }
}

4、存储脚本 Stored scripts 简介

在_scripts路径下新建脚本,脚本的名字为:calculate-score

POST _scripts/calculate-score
{
  "script": {
    "lang": "painless",
    "source": "Math.log(_score * 2) + params.my_modifier"
  }
}

Stored scripts 的使用方式:

GET my-index-000001/_search
{
  "query": {
    "script_score": {
      "query": {
        "match": {
            "message": "some message"
        }
      },
      "script": {
        "id": "calculate-score",
        "params": {
          "my_modifier": 2
        }
      }
    }
  }
}

5、参考:

https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-scripting-using.html

标签: none

添加新评论