ElasticSearch 插件开发

es有丰富的插件差不多 可以满平时开发的需求,但出现奇葩需求的时候又不能完全满足,所以就需要自定义开发插件了

目前es有以下几种插件可以去自定义

 

Analysis Plugins 分析插件

Discovery Plugins 发现插件 

Ingest Plugins 提取插件
增强每个节点的功能。 

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

Scripting Plugins 脚本插件

还有ActionPlugin 、searchPlugin、networkPlugin等 他们都是来丰富es功能 

 

代码如下 :

 

目录结构

 

新建plugin-descriptor.properties  的描述文件

description=${project.description}

version=${project.version}

name=${elasticsearch.plugin.name}

classname=${elasticsearch.plugin.classname}

java.version=${maven.compiler.target}

elasticsearch.version=${elasticsearch.version}


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

定义pom文件

<?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">
    <name>elasticsearch-plugin-test-6.0</name>
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch-plugin-test-6.0</artifactId>
    <version>${elasticsearch.version}</version>
    <packaging>jar</packaging>
    <description>elastic plugin test</description>
  

    <properties>
        <elasticsearch.version>6.0.0</elasticsearch.version>
        <maven.compiler.target>1.8</maven.compiler.target>
        <elasticsearch.assembly.descriptor>${project.basedir}/src/main/assemblies/plugin.xml</elasticsearch.assembly.descriptor>
        <elasticsearch.plugin.name>plugin test</elasticsearch.plugin.name>
        <elasticsearch.plugin.classname>org.elasticsearch.plugin.PrintPlugin</elasticsearch.plugin.classname>
        <elasticsearch.plugin.jvm>true</elasticsearch.plugin.jvm>
    </properties>

    <distributionManagement>
        <snapshotRepository>
            <id>oss.sonatype.org</id>
            <url>https://oss.sonatype.org/content/repositories/snapshots</url>
        </snapshotRepository>
    </distributionManagement>



    <dependencies>
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>${elasticsearch.version}</version>
            <scope>compile</scope>
        </dependency>


        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.2</version>
        </dependency>

        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.3</version>
        </dependency>

        <dependency>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-core</artifactId>
            <version>1.3</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-library</artifactId>
            <version>1.3</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <profiles>
        <profile>
            <id>java8</id>
            <activation>
                <jdk>[1.8,)</jdk>
            </activation>
            <properties>
                <additionalparam>-Xdoclint:none</additionalparam>
            </properties>
        </profile>
    </profiles>
</project>

 自定义actionPlugin

package org.elasticsearch.plugin;

import java.util.Collections;
import java.util.List;
import java.util.function.Supplier;

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.plugin.handler.PrintPluginHandler;
import org.elasticsearch.plugins.ActionPlugin;
import org.elasticsearch.plugins.Plugin;
import org.elasticsearch.rest.RestController;
import org.elasticsearch.rest.RestHandler;

public class PrintPlugin extends Plugin implements ActionPlugin {
	private static String actionProfix = "print";

	public PrintPlugin() {
		super();
		System.out.println(actionProfix + "插件实例化......");
	}

	@Override
	public List<RestHandler> getRestHandlers(Settings settings, RestController restController,
			ClusterSettings clusterSettings, IndexScopedSettings indexScopedSettings, SettingsFilter settingsFilter,
			IndexNameExpressionResolver indexNameExpressionResolver, Supplier<DiscoveryNodes> nodesInCluster) {
		return Collections.singletonList(new PrintPluginHandler(settings, restController));
	}

}  

actionPlugin的业务实现

package org.elasticsearch.plugin.handler;

import java.io.IOException;
import java.util.Date;

import org.elasticsearch.client.node.NodeClient;
import org.elasticsearch.common.inject.Inject;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.rest.BaseRestHandler;
import org.elasticsearch.rest.BytesRestResponse;
import org.elasticsearch.rest.RestController;
import org.elasticsearch.rest.RestRequest;
import org.elasticsearch.rest.RestRequest.Method;
import org.elasticsearch.rest.RestStatus;

public class PrintPluginHandler extends BaseRestHandler {

	private String printName = "printPluginTest"; 
	@Inject
	public PrintPluginHandler(Settings settings, RestController restController) {
		super(settings);
		restController.registerHandler(Method.GET, "print", this);// 注册
	}

	@Override
	public String getName() {

		return printName;
	}
	/**
	 * 处理业务逻辑
	 */
	@Override
	protected RestChannelConsumer prepareRequest(RestRequest request, NodeClient client) throws IOException {
		// 接收的参数
		System.out.println("params==" + request.params());

		long t1 = System.currentTimeMillis();

		String name = request.param("name");

		long cost = System.currentTimeMillis() - t1;
		// 返回内容,这里返回消耗时间 请求参数 插件名称
		return channel -> {
			XContentBuilder builder = channel.newBuilder();
			builder.startObject();
			builder.field("cost", cost);
			builder.field("name", name);
			builder.field("time", new Date());
			builder.field("pluginName",printName);
			builder.field("print","this is print plugin test");
			builder.endObject();
			channel.sendResponse(new BytesRestResponse(RestStatus.OK, builder));
		}; 

	}

}

 1、写完之后 执行 mvn clean package 

 2、找到elasticsearch-plugin-test-6.0-6.0.0.zip 文件 将文件解压到es的plugins文件下

 

 3、启动es

浏览器中输入 http://192.168.88.116:9200/print?name=1 

git地址:https://github.com/wangnanhui/elastic-plugin-test

 还可以自定义一个内存消耗本节点的内存消耗,磁盘占用等 很是方便

 

posted @ 2019-02-21 15:49  王南辉  阅读(6505)  评论(2编辑  收藏  举报