概述
ES插件官方介紹文檔:https://www.elastic.co/guide/en/elasticsearch/plugins/current/plugin-authors.html
1罩句、插件分類
ES提供了插件功能焚刺,可以自由擴展ES的功能,開發(fā)者可以根據(jù)自己的業(yè)務(wù)需求實現(xiàn)自定義的功能门烂。插件分類有以下類別:
AnalysisPlugin
分析插件乳愉,擴展索引分析功能,用于增強ES自身分析功能的不足屯远,例如大家熟知的IK分詞插件蔓姚。
ActionPlugin
Rest api接口請求插件。開發(fā)者可以開發(fā)自身需要的rest命令慨丐,也可以對rest請求進行增加處理坡脐。
ScriptPlugin
腳本插件。主要用于擴展ES的腳本功能房揭,比如自定義方法打分备闲,讓ES支持其他腳本語言。
SearchPlugin
查詢插件崩溪。擴展ES的查詢功能。
IngestPlugin
預(yù)處理插件斩松。在數(shù)據(jù)索引之前進行預(yù)處理伶唯,例如根據(jù)ip來增加地理信息的geoip processor plugin。
Ingest geoip processor plugin
NetworkPlugin
網(wǎng)絡(luò)傳輸插件惧盹。
MapperPlugin
映射插件乳幸。增強ES的數(shù)據(jù)類型瞪讼。
2、插件部署
ES插件部署在ES安裝目錄的plugins目錄下粹断。兩種方式部署插件:1)通過ES自帶的elasticsearch-plugin命令安裝打包好的插件zip包 2)直接將插件zip包解壓復(fù)制到plugins目錄下
ES插件能被正確加載要滿足以下幾個條件:
1)在plugins目錄下有對應(yīng)插件的目錄
2)插件目錄下包含打包好的jar包以及其依賴包
3)目錄下包含plugin-descriptor.properties插件描述文件
4)目錄下包含plugin-security.policy插件安全配置文件
3符欠、插件開發(fā)
1)工程結(jié)構(gòu)
2)pom.xml
<?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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.yyx.plugin</groupId>
<artifactId>es-plugin-demo</artifactId>
<version>${elasticsearch.version}</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<elasticsearch.version>7.3.1</elasticsearch.version>
<maven.compiler.target>1.8</maven.compiler.target>
<elasticsearch.description>test plugin</elasticsearch.description>
<elasticsearch.plugin.name>es-plugin-demo</elasticsearch.plugin.name>
<elasticsearch.plugin.classname>com.yyx.plugin.RequestPlugin</elasticsearch.plugin.classname>
</properties>
<dependencies>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>${elasticsearch.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2</version>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<outputDirectory>${project.build.directory}</outputDirectory>
<descriptors>
<descriptor>src/main/assembly/assembly.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
<!--maven編譯插件-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>
3)plugin-descriptor.properties
description={elasticsearch.description}
version=${project.version}
name=${elasticsearch.plugin.name}
classname=${elasticsearch.plugin.classname}
java.version=${maven.compiler.target}
elasticsearch.version=${elasticsearch.version}
description:插件描述
version:插件版本
name:插件名稱
classname:插件入口類名
java.version:依賴java版本
elasticsearch.version:插件兼容的ES版本(注意必須和運行ES版本強匹配)
3)plugin-security.policy
grant {
permission java.security.AllPermission;
};
plugin-security.policy是插件對敏感資源(比如本地文件)或者應(yīng)用代碼(類的方法)的訪問聲明。es要求插件開發(fā)者在plugin-security.policy中聲明對敏感資源的需求瓶埋,并在代碼中使用AccessController.doPrivileged包裹包含敏感操作的代碼希柿。
4)assembly.xml
zip打包描述文件
<?xml version="1.0" encoding="UTF-8"?>
<assembly>
<id>plugin</id>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>target</directory>
<outputDirectory>.</outputDirectory>
<includes>
<include>*.jar</include>
</includes>
<fileMode>0600</fileMode>
<directoryMode>0700</directoryMode>
</fileSet>
</fileSets>
<files>
<file>
<source>${project.basedir}/src/main/resources/plugin-descriptor.properties</source>
<filtered>true</filtered>
</file>
<file>
<source>${project.basedir}/src/main/resources/plugin-security.policy</source>
<filtered>true</filtered>
</file>
</files>
</assembly>
5)插件業(yè)務(wù)實現(xiàn)
public class RequestPlugin extends Plugin implements ActionPlugin {
@Override
public UnaryOperator<RestHandler> getRestHandlerWrapper(ThreadContext threadContext) {
return (RestHandler r) -> new RequestPluginHandler(r);
}
}
public class RequestPluginHandler implements RestHandler {
private RestHandler restHandler;
public RequestPluginHandler(RestHandler restHandler) {
super();
this.restHandler = restHandler;
}
/**
* 處理業(yè)務(wù)邏輯
*/
@Override
public void handleRequest(RestRequest request, RestChannel channel, NodeClient client) throws Exception {
String remoteHostName = request.getHttpChannel().getRemoteAddress().getAddress().getHostName();
System.out.println("remote host name : " + remoteHostName);
restHandler.handleRequest(request, channel, client);
}
}
如上代碼handleRequest打印每個rest請求遠端IP地址(無實際意義,僅用于測試)养筒。
6)部署并執(zhí)行
插件部署后目錄如下:
發(fā)送任意rest請求曾撤,ES輸出如下打印記錄: