基于elasticsearch6.2.3版本自定义插件开发遇到的问题总结
项目背景:
原本工业APP的知识文章之类的存储在MySQL中,但是在后期的开发中发现在查询的时候又不满足业务的模糊查询需求并且需要兼容前期的设计(ID为数值型的要求)。
项目构建:
项目利用gradle构建,利用shadowJar插件来打包需要的程序代码,默认打包的包含程序代码和依赖,但是开发插件是不能将es打包会造成包冲突。代码如图:
开发过程:
1、继承Plugin类和实现ActionPlugin接口并将插件名称注册即可;
2、自定义类继承BaseRestHandler,在构造方法中注册自定义的uri,并且prepareRequest方法中完成自定义的实现方式,ID自增的方式是本机IP地址奇数乘积后相加然后加上当前的毫秒时间戳不大于19为long的最大值即可。
下面介绍一下plugin-descriptor.properties文件:
description:插件描述
name: 插件名称
version : 版本号
classname : 自定义插件的全路径名
java.version : Java版本号
elasticsearch.version : elasticsearch 版本号
以下是打包运行时出现的问题:
一:elasticsearch插件目录问题:
在开发elasticsearch6.2.3插件时编写好插件后,把插件上传到plugins目录下
加载时
./elasticsearch-plugin install file:///opt/elasticsearch-6.2.3/plugins/elasticsearch.zip
会报错如下:
ERROR: `elasticsearch` directory is missing in the plugin zip
可是的zip包中确实包含了elasticsearch文件目录,这条路暂时走不通了(也许是我没有理解官网的意思,英文是硬伤啊)。
另一个思路开始:
既然官网的说jar包和配置文件都必须包含在elasticsearch目录,那么就直接在plugins目录下建立elasticsearch目录,然后把jar包和配置文件上传到此目录,然后启动elasticsearch,结果成功了,目录结果如下
:
另一种解决方案:
可以在moudles目录下建立目录如:xx目录,将jar包和配置文件上传至此目录,如下图:
elasticsearch启动后会自动加载它。
二:Java安全框架问题总结:
在开发elasticsearch框架时会遇到java.security.AccessControlException异常,因为es启动不能用root账户启动,如果项目中需要用到Redis或者zookeeper或者读文件或者数据库等,可能也会有一下问题。
解决方案:
在$JAVA_HOME/lib/security/java.policy加入相应权限即可:
permission java.io.FilePermission "file:/opt/elasticsearch-6.2.3/modules/key-plugin/conf/xxx.properties", "read";
permission javax.management.MBeanServerPermission "createMBeanServer";
permission javax.management.MBeanPermission "org.apache.commons.pool2.impl.GenericObjectPool#-[org.apache.commons.pool2:name=pool,type=GenericObjectPool]", "registerMBean";
permission javax.management.MBeanTrustPermission "register";
permission java.lang.RuntimePermission "getClassLoader";
permission java.net.SocketPermission "xxxx.xxxx.xx.xx:6379","connect,resolve";
permission java.net.SocketPermission "xxxx.xxxx.xx.xx:2181","connect,resolve";
[昆明]大观公园:巨型月亮光影水景营造美丽中秋“夜色”
相关推荐
另外一部分,则需要先做聚类、分类处理,将聚合出的分类结果存入ES集群的聚类索引中。数据处理层的聚合结果存入ES中的指定索引,同时将每个聚合主题相关的数据存入每个document下面的某个field下。