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
還可以自定義一個內存消耗本節點的內存消耗,磁盤占用等 很是方便
