Elasticsearch painless脚本中使用java自定义类函数
Posted 天水麒麟姜伯约
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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块加入我们自定义的类名和方法
可以发现接口正常返回,这样的话我们就可以在我们的自定义类中加入复杂的业务实现逻辑,有针对性的进行数据处理.
以上是关于Elasticsearch painless脚本中使用java自定义类函数的主要内容,如果未能解决你的问题,请参考以下文章
Elasticsearch painless脚本中使用java自定义类函数
Elasticsearch如何在 Elasticsearch 中轻松编写脚本
Elasticsearch如何在 Elasticsearch 中轻松编写脚本
[ElasticSearch]painless脚本使用方式及性能比较