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'
-
-
更新插件
先remove
再install
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 插件开发
文章评论