Elasticsearch painless脚本中使用java自定义类函数

前言

        elasticsearch作为最受欢迎的开源搜索引擎,其核心功能使用java语言实现,内置了大量的http api用来完成数据的插入、修改、删除等。并且在使用http api的过程中,集成了各种脚本引擎,极大的提升了数据批量操作的效率以及灵活性,并且允许开发者按照接口规范按照实际需要对脚本引擎进行拓展。painless 为 内置默认脚本语言,脚本语法简单易上手。数据类型与java的内置数据类型存在一定的映射关系,应该来说,基本能够满足正常的数据维护需求。painless脚本引擎维护了一个白名单,在白名单中列出了脚本中可以访问的java类型以及允许访问的方法签名。

            

painless脚本引擎核心jar包文件位于elasticsearch安装目录\ modules\lang-painless下 

白名单文件在lang-painless jar 包之中,以"包名.txt"文件命名,以java.lang.txt文件为例

java.lang.txt文件内容如下

        

 

可以发现java.lang.String类开放了大部分的方法,java.lang.System类只开放了有限的几个方法,

这些方法主要是static方法,在脚本中调用的时候使用 "类名完全限定名称加方法名" 的格式

一、为什么在脚本中使用自定义类方法

       比如遇到一些较为复杂的数据处理逻辑时,为了避免在在脚本中使用过长过多的表达式,因为可能容易出现语法上的错误,而且在脚本中加入过多的表达式可能不容易进行调试。所以可以使用自己擅长和偏好的开发语言

二、如何在脚本中使用自定义类方法

1.定义一个普通的java类 csp.cmt.SH 并加入一些自定义的静态方法,如下图所示

               

图中的log方法,调用了OutputDebugView,可以将调试信息输出到DebugView工具,flog方法可以将调试信息输出到文件

 2.定义一个白名单文件csp.cmt.txt,白名单文件中加入类名和需要开放的方法签名,注意不要加上方法参数名和分号

        

csp.cmt.SH类编译成功之后class加入lang-painless jar包中

白名单csp.cmt.txt也放入 lang-painless jar包的  org\elasticsearch\painless\spi 目录下

完成之后重新启动elasticsearch

三、使用postman调用测试

我们知道可以使用http 的_update_by_query接口更新es数据,在script块加入我们自定义的类名和方法

 可以发现接口正常返回,这样的话我们就可以在我们的自定义类中加入复杂的业务实现逻辑,有针对性的进行数据处理.

    

猜你喜欢

转载自blog.csdn.net/weixin_38526093/article/details/128974973