ElasticSearch es 插件开发

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 配置,已经打包配置

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”>

4.0.0

com.caspar.es.plugin

es-plugin-hello

5.5.3

es-plugin-hello

My first es plugin

UTF-8

1.8

5.5.3

es-plugin-hello

com.caspar.es.plugin.hello.HelloPlugin

1.8

org.elasticsearch

elasticsearch

${es.version}

provided

src/main/resources

true

*.properties

org.apache.maven.plugins

maven-compiler-plugin

2.3.2

${java.version}

${java.version}

maven-assembly-plugin

2.4

false

src/main/assemblies/plugin.xml

es-plugin-hello

make-assembly

package

single

plugin.xml 里面配置zip的打包配置

release

zip

false

/elasticsearch/

true

true

target/classes/plugin-descriptor.properties

/elasticsearch/

src/main/resources/plugin-security.policy

/elasticsearch/

三. 插件入口开发

插件入口需要继承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地址

你可能感兴趣的:(elasticsearch,大数据,搜索引擎)