• ElasticSearch es 插件开发


    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}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

    
    
        4.0.0
    
        com.caspar.es.plugin
        es-plugin-hello
        5.5.3
        es-plugin-hello
        My first es plugin
    
        
            UTF-8
            1.8
            5.5.3
            es-plugin-hello
            com.caspar.es.plugin.hello.HelloPlugin
            1.8
        
    
    
        
            
                org.elasticsearch
                elasticsearch
                ${es.version}
                provided
            
    
    
        
    
        
            
                
                    src/main/resources
                    true
                    
                        *.properties
                    
                
            
            
                
                    org.apache.maven.plugins
                    maven-compiler-plugin
                    2.3.2
                    
                        ${java.version}
                        ${java.version}
                    
                
    
                
                    maven-assembly-plugin
                    2.4
                    
                        false
                        
                            src/main/assemblies/plugin.xml
                        
                        es-plugin-hello
                    
                    
                        
                            make-assembly
                            package
                            
                                single
                            
                        
                    
                
            
        
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77

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

    
    
        release
        
            zip
        
        false
        
            
                /elasticsearch/
                true
                true
            
        
        
            
                target/classes/plugin-descriptor.properties
                /elasticsearch/
            
            
                src/main/resources/plugin-security.policy
                /elasticsearch/
            
        
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    三. 插件入口开发
    插件入口需要继承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 {
    
    
        @Override
        public List getRestHandlers(Settings settings, RestController restController, ClusterSettings clusterSettings, IndexScopedSettings indexScopedSettings, SettingsFilter settingsFilter, IndexNameExpressionResolver indexNameExpressionResolver, Supplier nodesInCluster) {
            return Collections.singletonList(new HelloHandler(settings, restController));
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    四. 插件处理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);
            }
    
    
            @Override
            protected 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));
                };
            }
    
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

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

    3. 插件管理

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

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

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

        bin/elasticsearch-plugin install 'plugin name'
        
        • 1
      • 安装网络上的插件,直接填url地址

        bin/elasticsearch-plugin install 'url'
        
        • 1
      • 安装本地插件,file:// + 本地zip文件地址

        bin/elasticsearch-plugin install 'file:///path/to/plugin.zip'
        
        • 1
    • 更新插件
      removeinstall

      bin/elasticsearch-plugin remove 'plugin name'
      bin/elasticsearch-plugin install 'plugin name'
      
      • 1
      • 2

    测试插件效果

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

    {
      "cost": 0,
      "name": "caspar",
      "time": "2018-09-16T06:09:33.199Z"
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 相关阅读:
    windows版本-idea中下载的java版本在哪
    【毕业设计】机器学习的溢油特征提取与识别
    就在刚刚这份java八股文成功让我进入字节,拿到了人生第一个18k
    04、SpringAOP详解
    操作系统进程的概念、组成和特征
    连锁零售门店固定资产管理的痛点及解决方案
    字符串函数以及内存函数的模拟实现(超详细,全面理解字符串函数!!!)
    【PHP设计模式03】抽象工厂模式
    大厂招人不怕花钱的原因是。。。
    实现自定义SpringBoot的Starter
  • 原文地址:https://blog.csdn.net/m0_67402588/article/details/126358628