Elasticsearch黑鸟教程30:painless脚本简介
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