简介
官方文档:https://www.elastic.co/guide/en/elasticsearch/painless/current/index.html
Painless是一种专门为Elasticsearch设计的简单安全的脚本语言。也是官方主推的脚本语言,后续的Elasticsearch只会支持它。可以在Elasticsearch任意可以被使用的地方使用,比如script_fields script_score。
优点
- 快速执行:比其他替代品的速度快几倍
- 安全性:带有方法调用/字段粒度的细粒度白名单
- 可选类型:变量和参数可以使用显示类型或者动态类型
def - 语法:拓展了java语法,提供Groovy风格的脚本语言特性,使写脚本更加简单。
- 优化:专门为Elasticsearch脚本设计。
简单用法
- 获取Document Values:
doc['fields'] - 更新字段:
ctx._source.<fields> - 日期:Date类型的字段可以通过
ReadableDateTime来获取,支持getYear,getDayOfWeek,getMillis等 - 正则:默认是禁止的。可以通过
elasticsearch.yml设置script.painless.regex.enabled: true来启用正则。(Elastic团队目前也希望有一个更好的替代方案,后续可能会有其他方式来启用正则)常用的语法/pattern/=~==~Pattern.matcherMatcher.replaceAll($1和\1代表分组)
查询的时候也可使用脚本,但是不能够使用倒排索引。因此尽量避免脚本查询吧
方法调用及分派
使用接收器、名称、参数数量来进行方法分派
不支持方法重载
- 对于
def类型的操作更加简单,可能更快。 - 保持了一致性。
- 保证Painless的可维护性。
调试
Painless提供了一个方法
Debug.explain来捕获异常,可以通过_explain来查看上下文内容
语言规范
基本
- Painless的语法类似Groovy。
- Painless本质上是Java添加了一些脚本语言特性的子集,写的时候更加简单。
- Painless脚本用
ANTLR4和ASM库 解析编译
注释
支持单行和多行注释
// single-line comment
<code> // single-line comment
/* multi-
line
comment */
<code> /* multi-line
comment */ <code>
<code> /* multi-line comment */ <code>
关键词
if else while do for in continue break return new try catch throw this instanceof






网友评论