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
还可以自定义一个内存消耗本节点的内存消耗,磁盘占用等 很是方便