简介
官方文档: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.matcher
Matcher.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
网友评论