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