ElasticSearch es 插件开发

1. 插件分类

  • API Extension Plugins API扩展插件
    通过添加新的API或功能向Elasticsearch添加新功能,通常与搜索或映射有关。
    优秀插件代表:
    SQL language Plugin: 让 Elasticsearch 支持 SQL语句查询 (by NLPchina)

  • Alerting Plugins 告警插件
    监控Elasticsearch索引情况,并在超过某个阈值时触发告警。
    优秀插件代表:
    X-Pack

  • Analysis Plugins 分析插件
    扩展索引的分析规则,比如各种分词插件
    优秀插件代表:
    IK Analysis Plugin 中文分词
    Japanese(Kuromoji) Analysis plugin 日文分词
    PinyinAnalysis Plugin 拼音分词

  • Discovery Plugins 发现插件
    通过添加可用于代替Zen Discovery的新发现机制来扩展Elasticsearch 。

  • Ingest Plugins 提取插件
    增强每个节点的功能。
    优秀插件代表:
    Ingest Attachment Processor Plugin 让每个节点都可以处理附件文件

  • Management Plugins 管理插件
    管理Es集群
    优秀插件代表:X-Pack

  • Mapper Plugins 映射插件
    主要用来扩展es数据类型

  • Scripting Plugins 脚本插件
    主要用来扩展es的脚本功能,让es支持使用其他脚本语言。
    优秀插件代表:
    JavaScript Language
    Python Language

  • Security Plugins 安全插件
    扩展es的安全策略,比如控制api的访问权限等
    优秀插件代表:X-Pack

  • Snapshot/Restore Repository Plugins 快照/还原存储库插件
    扩展es的快照和恢复功能

  • Store Plugins 存储插件
    扩展es的存储方式,es默认使用的是Lucene存储数据的
    优秀插件代表:
    Store SMB Windows SMB

2. 插件开发

一 . 建立插件描述文件
es插件描述文件名为 plugin-descriptor.properties 放在 src/main/resources/ 目录下,内容如下

属性 描述
name 插件名字
version 插件版本
description 插件功能描述
classname 插件入口class,完整路径
java.version jdk 版本
elasticsearch.version elasticsearch 版本

内容如下,这里都是引用项目的配置属性

version=${project.version}
description=${project.description}
name=${es.plugin.name}
classname=${es.plugin.classname}
java.version=${es.plugin.java.version}
elasticsearch.version=${es.version}

二. pom.xml 配置,已经打包配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.caspar.es.plugin</groupId><artifactId>es-plugin-hello</artifactId><version>5.5.3</version><name>es-plugin-hello</name><description>My first es plugin</description><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><java.version>1.8</java.version><es.version>5.5.3</es.version><es.plugin.name>es-plugin-hello</es.plugin.name><es.plugin.classname>com.caspar.es.plugin.hello.HelloPlugin</es.plugin.classname><es.plugin.java.version>1.8</es.plugin.java.version></properties><dependencies><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>${es.version}</version><scope>provided</scope></dependency></dependencies><build><resources><resource><directory>src/main/resources</directory><filtering>true</filtering><includes><include>*.properties</include></includes></resource></resources><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.3.2</version><configuration><source>${java.version}</source><target>${java.version}</target></configuration></plugin><plugin><artifactId>maven-assembly-plugin</artifactId><version>2.4</version><configuration><appendAssemblyId>false</appendAssemblyId><descriptors><descriptor>src/main/assemblies/plugin.xml</descriptor></descriptors><finalName>es-plugin-hello</finalName></configuration><executions><execution><id>make-assembly</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin></plugins></build>
</project>

plugin.xml 里面配置zip的打包配置

<?xml version="1.0"?>
<assembly><id>release</id><formats><format>zip</format></formats><includeBaseDirectory>false</includeBaseDirectory><dependencySets><dependencySet><outputDirectory>/elasticsearch/</outputDirectory><useProjectArtifact>true</useProjectArtifact><useTransitiveDependencies>true</useTransitiveDependencies></dependencySet></dependencySets><files><file><source>target/classes/plugin-descriptor.properties</source><outputDirectory>/elasticsearch/</outputDirectory></file><file><source>src/main/resources/plugin-security.policy</source><outputDirectory>/elasticsearch/</outputDirectory></file></files>
</assembly>

三. 插件入口开发
插件入口需要继承Plugin类,然后实现相应的插件类型接口,去做相应的处理。我们这里实现ActionPlugin接口 实现一个api的插件类型,需要重写getRestHandlers方法,并将自己处理业务逻辑的handler类注册进去
HelloPlugin 内容

package com.caspar.es.plugin.hello;import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver;
import org.elasticsearch.cluster.node.DiscoveryNodes;
import org.elasticsearch.common.settings.ClusterSettings;
import org.elasticsearch.common.settings.IndexScopedSettings;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.settings.SettingsFilter;
import org.elasticsearch.plugins.ActionPlugin;
import org.elasticsearch.plugins.Plugin;
import org.elasticsearch.rest.RestController;
import org.elasticsearch.rest.RestHandler;import java.util.Collections;
import java.util.List;
import java.util.function.Supplier;/*** @author caspar.chen* @date 2018/9/16**/
public class HelloPlugin extends Plugin implements ActionPlugin {@Overridepublic List<RestHandler> getRestHandlers(Settings settings, RestController restController, ClusterSettings clusterSettings, IndexScopedSettings indexScopedSettings, SettingsFilter settingsFilter, IndexNameExpressionResolver indexNameExpressionResolver, Supplier<DiscoveryNodes> nodesInCluster) {return Collections.singletonList(new HelloHandler(settings, restController));}}

四. 插件处理Handler,处理具体业务逻辑

HelloHandler 内容

package com.caspar.es.plugin.hello;import org.elasticsearch.client.node.NodeClient;import org.elasticsearch.common.settings.Settings;import org.elasticsearch.common.xcontent.XContentBuilder;import org.elasticsearch.rest.*;import java.io.IOException;import java.util.Date;/*** @author caspar* @date 2018/9/16**/public class HelloHandler extends BaseRestHandler {protected HelloHandler(Settings settings, RestController restController) {super(settings);//api的url映射restController.registerHandler(RestRequest.Method.GET, "/_hello", this);}@Overrideprotected BaseRestHandler.RestChannelConsumer prepareRequest(RestRequest restRequest, NodeClient nodeClient) throws IOException {//接收的参数System.out.println("params==" + restRequest.params());long t1 = System.currentTimeMillis();String name = restRequest.param("name");long cost = System.currentTimeMillis() - t1;//返回内容,这里返回一个处理业务逻辑的发费时间,前端传的name,以及当前时间。return channel -> {XContentBuilder builder = channel.newBuilder();builder.startObject();builder.field("cost", cost);builder.field("name", name);builder.field("time", new Date());builder.endObject();channel.sendResponse(new BytesRestResponse(RestStatus.OK, builder));};}}

开发好后,执行maven打包,会在target目录生成相应的zip文件。这个就是我们需要的插件包,后面安装插件会用到。

3. 插件管理

  • 查看安装的插件列表
    使用 list 参数列出安装的所有插件

    bin/elasticsearch-plugin list
    
  • 安装插件
    使用 install 参数安装插件

    • es 团队维护的核心插件,直接用插件名安装

      bin/elasticsearch-plugin install 'plugin name'
      
    • 安装网络上的插件,直接填url地址
      bin/elasticsearch-plugin install 'url'
      
    • 安装本地插件,file:// + 本地zip文件地址
      bin/elasticsearch-plugin install 'file:///path/to/plugin.zip'
      
  • 更新插件
    removeinstall

    bin/elasticsearch-plugin remove 'plugin name'
    bin/elasticsearch-plugin install 'plugin name'
    

测试插件效果

安装好插件后,需要重启elasticsearch,并且要在每个node上安装重启才有效
安装好后在kibana或者curl GET _hello?name=caspar
会看到返回结果

{"cost": 0,"name": "caspar","time": "2018-09-16T06:09:33.199Z"
}

ElasticSearch es 插件开发相关推荐

  1. [Elasticsearch] es 6.6 编译报错 SSL peer shut down incorrectly

    1.概述 前提:[Elasticsearch] es 6.6 编译报错 java.net.ConnectException: Operation timed out Mac 编译es 6.8 报错 [ ...

  2. ElasticSearch (ES)学习之路(二)Win10安装ES,可视化界面,Kibanna

    ElasticSearch (ES)学习之路(二)Win10安装ES,可视化界面,Kibanna 我前一段时间学习的时候ES 还是7.6.x 现在看ES 官网已经到了7.8.X了,迭代维护的速度还是挺 ...

  3. ElasticSearch(ES)

    文章目录 备注.必看 ElasticSearch 和 Solr 介绍,对比 ElasticSearch 7.8. 官网 基本概念 Cluster(集群) 与 Node(节点) Index -索引 索引 ...

  4. Elasticsearch(ES)的下载与安装

    Elasticsearch(ES)的下载与安装 1.安装 Java 在安装 Elasticsearch 之前,我们需要安装并配置好 JDK, 设置好环境变量 $JAVA_HOME. Elasticse ...

  5. ElasticSearch -- ES 7.x 集群版安装部署

    向导 1. ElasticSearch 1.下载 2.配置 3.查看启动状态 4.注册宕机.开机自启 5.如果磁盘是SSD,建议修改IO调度算法 6.SSD磁盘,关闭numa绑核.hugepage 2 ...

  6. 3.1 ElasticSearch River插件开发

    参考资料: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-plugins.html htt ...

  7. elasticsearch(es)分布式全文检索引擎 简介

    0. 带着问题上路-ES是如何产生的? (1)思考:大规模数据如何检索? 如:当系统数据量上了10亿.100亿条的时候,我们在做系统架构的时候通常会从以下角度去考虑问题: 1)用什么数据库好?(MyS ...

  8. 使用canal同步MySQL数据到Elasticsearch(ES)

    目录 1.功能及使用场景 1.1.功能介绍 1.2.使用场景 2.需求引入 3.canal文件下载及准备 3.1 下载文件 3.2 准备文件 4.deployer安装及效果测试 4.1.deploye ...

  9. [Elasticsearch] es 6.6 编译报错 java.net.ConnectException: Operation timed out

    1.概述 Mac 编译es 6.8 报错 [lcc@lcc ~/IdeaProjects/source_code/elasticsearch]$ ./gradlew assemble Download ...

最新文章

  1. 【CEO赠书】《精益数据分析》:如何构建数据指标体系
  2. 成为一名优秀数据分析师的必经之路
  3. 深入Java核心 Java内存分配原理精讲(3)
  4. 世界五星级大厨经典菜品集
  5. 认清业务、技术与软件系统的价值链
  6. 信号处理与信号产生电路
  7. 如履薄冰 —— Redis懒惰删除的巨大牺牲
  8. fatal error: openssl/evp.h: 没有那个文件或目录
  9. 深入浅出OOP(一): 多态和继承(早期绑定/编译时多态)
  10. Linux的版本可分为,Linux不同分类标准下的各种版本解读
  11. centos 6.5 安装 phpmyadmin
  12. Springboot+Vue+EasyExcel实现web页面的excel下载
  13. CocosCreator代码混淆加密
  14. 基于用户的协同过滤Movielens电影推荐系统简单实例
  15. 【腾讯地图】纯手写微信定位考勤小程序,内附完整源码!
  16. Redis 进阶笔记
  17. python中空格怎么打_Python中如何打印空行
  18. strchr、strstr函数
  19. 网络RTK无人机上机测试
  20. 牛顿是人类历史上第二伟大的科学家吗?

热门文章

  1. 2021网安保研之路----北京邮电大学
  2. IDEA中Maven项目复制模块步骤以及可能出现的问题与解决问题的方法
  3. 大学英语六级考试2023年6月
  4. 将java中数组转换为ArrayList的方法实例(包括ArrayList转数组)
  5. 下载github包慢
  6. 电影演员合作关系可视化(一)整体思路与爬虫编写
  7. 详谈四大主流CPU体系架构
  8. 动手制作属于你自己的WIN PE3.0
  9. Swap 与 Swappiness
  10. 考研拼的是智商还是勤奋努力?智商中下但勤奋,考研能成功吗?