ElasticSearch es 插件开发

2021年12月15日 391点热度 0条评论

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}

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


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.0modelVersion>

    groupId>com.caspar.es.plugingroupId>
    artifactId>es-plugin-helloartifactId>
    version>5.5.3version>
    name>es-plugin-helloname>
    description>My first es plugindescription>

    properties>
        project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
        java.version>1.8java.version>
        es.version>5.5.3es.version>
        es.plugin.name>es-plugin-helloes.plugin.name>
        es.plugin.classname>com.caspar.es.plugin.hello.HelloPlugines.plugin.classname>
        es.plugin.java.version>1.8es.plugin.java.version>
    properties>


    dependencies>
        dependency>
            groupId>org.elasticsearchgroupId>
            artifactId>elasticsearchartifactId>
            version>${es.version}version>
            scope>providedscope>
        dependency>


    dependencies>

    build>
        resources>
            resource>
                directory>src/main/resourcesdirectory>
                filtering>truefiltering>
                includes>
                    include>*.propertiesinclude>
                includes>
            resource>
        resources>
        plugins>
            plugin>
                groupId>org.apache.maven.pluginsgroupId>
                artifactId>maven-compiler-pluginartifactId>
                version>2.3.2version>
                configuration>
                    source>${java.version}source>
                    target>${java.version}target>
                configuration>
            plugin>

            plugin>
                artifactId>maven-assembly-pluginartifactId>
                version>2.4version>
                configuration>
                    appendAssemblyId>falseappendAssemblyId>
                    descriptors>
                        descriptor>src/main/assemblies/plugin.xmldescriptor>
                    descriptors>
                    finalName>es-plugin-hellofinalName>
                configuration>
                executions>
                    execution>
                        id>make-assemblyid>
                        phase>packagephase>
                        goals>
                            goal>singlegoal>
                        goals>
                    execution>
                executions>
            plugin>
        plugins>
    build>
project>

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


assembly>
    id>releaseid>
    formats>
        format>zipformat>
    formats>
    includeBaseDirectory>falseincludeBaseDirectory>
    dependencySets>
        dependencySet>
            outputDirectory>/elasticsearch/outputDirectory>
            useProjectArtifact>trueuseProjectArtifact>
            useTransitiveDependencies>trueuseTransitiveDependencies>
        dependencySet>
    dependencySets>
    files>
        file>
            source>target/classes/plugin-descriptor.propertiessource>
            outputDirectory>/elasticsearch/outputDirectory>
        file>
        file>
            source>src/main/resources/plugin-security.policysource>
            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 {


    @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));
    }

}

四. 插件处理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));
            };
        }

    }

开发好后,执行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 插件开发

harry

这个人很懒,什么都没留下

文章评论