文档章节

ElasticSearch 2 Plugin 插件开发

南湖船老大
 南湖船老大
发布于 2016/10/02 12:16
字数 871
阅读 344
收藏 1

最近有一个需求,因为自己用的是最新版本的elasticsearch,网上现有的东东满足不了要求,就想自己写一个,不过苦于找不到中文文档,也没有最新的英文资料。最后结合一些1.x的中文资料和官方插件的源码,算是把elasticsearch插件开发的基本套路摸清楚了。此文也仅是一个demo,还没开发出可用的插件,后续会继续深入。

    由于elasticSearch是Java开发的,所以二次开发是很轻松的,稍微看了下,弄了个原型。

    先建立一个mvn工程,加入elasticsearch的依赖。然后,需要一个继承自plugin的类

package me.baicai.elasticplusdemo;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import org.elasticsearch.common.component.LifecycleComponent;
import org.elasticsearch.common.inject.Module;
import org.elasticsearch.common.logging.ESLogger;
import org.elasticsearch.common.logging.Loggers;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.plugins.Plugin;
import org.elasticsearch.rest.RestModule;

public class MyDemoPlugin extends Plugin {
	final ESLogger logger = Loggers.getLogger(getClass());
	private final Settings settings;
	
	public MyDemoPlugin(Settings settings) {
		this.settings = settings;
	}
	
	/**
	 * 插件的简单描述
	 */
	@Override
	public String description() {
		return "this is a demo by baicai";
	}
	
	/**
	 * 插件的名字,区分大小写,放到plugins文件夹要注意了
	 */
	@Override
	public String name() {
		return "myDemo";
	}
	
	/**
	 * 节点级别的模块,也可以是index级别
	 */
	@Override
	public Collection nodeModules() {
		// 创建自己的模块集合
		// 如果没有自定义模块,则可以返回空
		// if (settings.getAsBoolean("bc.enabled", true)) {
		return Collections. singletonList(new HelloModule());
		// }
	}

	@Override
	public Collection<Class<? extends LifecycleComponent>> nodeServices() {
		Collection<Class<? extends LifecycleComponent>> services = new ArrayList();
		services.add(AwesomePluginService.class);
		return services;
	}
	
	/**
	 * 所有模块初始化的时候会调用这里
	 * @param module
	 */
	public void onModule(Module module) {
		String isPluginEnabled = settings.get("bc.enabled");
		// logger.info("bc.enable="+isPluginEnabled);
		if (module instanceof RestModule) {
			((RestModule) module).addRestAction(HelloWorldHandler.class);
		}
		if (module instanceof HelloModule) {
			logger.info("############## process hello module #####################");
		}
	}

}

    在2.4之前的版本,没有plugin这个父类,而是一个叫做abstractPlugin的抽象类。到了2.4,abstract这个前缀被去掉了,当然它还是一个抽象类。另外和之前版本不同的是,现在的module有不同级别的module了,node、index、shard级别,可以作用在不同的层级,而之前统一都叫module。

    如果只是一个简单的Plugin的话,其实到这里就算是搭好骨架了。但是Plugin总要做一些事情的,那这个做事情的代码在哪呢?主要就是这里了:

public void onModule(Module module) {
		String isPluginEnabled = settings.get("bc.enabled");
		// logger.info("bc.enable="+isPluginEnabled);
		if (module instanceof RestModule) {
			((RestModule) module).addRestAction(HelloWorldHandler.class);
		}
		if (module instanceof HelloModule) {
			logger.info("############## process hello module #####################");
		}
	}

    这段代码在RestModule那里做了个扩展,也就是如果调用到了RestModule,那就执行我自己定义的HelloWorldHandler方法。让我们来看看这个类

package me.baicai.elasticplusdemo;

import org.elasticsearch.client.Client;
import org.elasticsearch.common.inject.Inject;
import org.elasticsearch.common.logging.ESLogger;
import org.elasticsearch.common.logging.Loggers;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.rest.BaseRestHandler;
import org.elasticsearch.rest.BytesRestResponse;
import org.elasticsearch.rest.RestChannel;
import org.elasticsearch.rest.RestController;
import org.elasticsearch.rest.RestRequest;
import org.elasticsearch.rest.RestRequest.Method;
import org.elasticsearch.rest.RestResponse;
import org.elasticsearch.rest.RestStatus;

public class HelloWorldHandler extends BaseRestHandler{
	final ESLogger logger = Loggers.getLogger(getClass());  
	
	@Inject
	public HelloWorldHandler(Settings settings, RestController controller, Client client) {
		super(settings, controller, client);
		//将该Handler绑定到某访问路径  
        controller.registerHandler(Method.GET, "/hello/", this);
        controller.registerHandler(Method.GET, "/hello/{name}", this);  
	}
	
	//处理绑定路径的请求访问 
	@Override
	public void handleRequest(RestRequest request, RestChannel channel, Client client) throws Exception {  	logger.debug("HelloWorldAction.handleRequest called");  
        final String name = request.hasParam("name") ? request.param("name") : "world";   
        String content = "{\"success\":true, \"message\":\"hello " +name+ "\"}";  
        RestResponse response = new BytesRestResponse(RestStatus.OK, BytesRestResponse.TEXT_CONTENT_TYPE, content);  
        channel.sendResponse(response);  
		
	}

}

  这个方法很简单,就是拦截了形如 /hello/* 这样的请求,并加入了自己的逻辑,最后输出一段处理过的JSON。

   其实到这里就算差不多了,最后就是添加一个plugin-descriptor.properties 文件,内容如下:

description=Hello Plugin By Baicai
version=2.4.0
name=myDemo
site=false
jvm=true
java.version=1.7
elasticsearch.version=2.4.0
isolated=false

mvn编译后,在elasticsearch/plugin目录下新建一个myDemo文件夹,扔进去jar包和plugin-descriptor.properties 文件即可。重启elasticsearch后,如下图

可以看到,myDemo已经在plugin列表里了。

完整的源码:https://github.com/iminto/elasticplugindemo

© 著作权归作者所有

共有 人打赏支持
南湖船老大
粉丝 679
博文 11
码字总数 10246
作品 0
深圳
其他
Elastic Search学习笔记2——安装head插件

下载head插件地址 http://mobz.github.io/elasticsearch-head/ 安装 在V2中,进入elasticsearch/bin目录 使用plugin可以直接安装插件 plugin install mobz/elasticsearch-head 在浏览器中输入...

晨猫
03/09
0
0
在Windows上安装Elasticsearch-6.3.2

一、JAVA环境配置 ElasticSearch是基于lucence开发的,也就是运行需要java jdk()支持。所以要先安装JAVA环境。 下载JDK1.7,下载完成后安装。 接下来就是环境变量配置,此处省略,因为作为一个j...

yaukie
08/20
0
0
ElasticSearch安装

ElasticSearch的安装 http://www.elasticsearch.org/下载最新的ElastiSearch版本。 解压下载文件。 cd到${esroot}/bin/,执行elasticsearch启动。 使用curl -XPOST localhost:9200/shutdown......

liuhao_sh
2015/08/13
0
0
windows下安装elasticsearch

windows下安装elasticsearch 1.下载elasticsearch,解压 2.配置环境变量path,指向elasticsearch的bin 3.发布为service。打开dos窗口输入:service -install [service-name] 启动elasticsear...

吕坤
2013/12/19
0
0
分布式搜索引擎Elasticsearch安装配置

分布式搜索引擎Elasticsearch 介绍 Elasticsearch是一个基于Lucene的开源分布式搜索引擎,具有分布式多用户能力。Elasticsearch是用java开发,提供Restful接口,能够达到实时搜索、高性能计算...

汪兴
2015/04/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

sed命令扩展使用操作

打印某行到某行之间的内容 假若文件test.txt的内容是: ertfff**[abcfd]123324444[rty]**fgfgf 怎么能截取 [abcfd]123324444[rty] 这一部分出来呢? 操作命令: 知道开始行和结...

野雪球
36分钟前
1
0
JVM内存笔记

Hotspot JVM 中的 Java 线程与原生操作系统线程有直接的映射关系。当线程本地存储、缓 冲区分配、同步对象、栈、程序计数器等准备好以后,就会创建一个操作系统原生线程。 Java 线程结束,原...

凌渡
42分钟前
1
0
284. Peeking Iterator

Description Tag: Design Difficulties: Medium Given an Iterator class interface with methods: next() and hasNext(), design and implement a PeekingIterator that support the pee......

52iSilence7
44分钟前
1
0
防止快速重复点击的两种思维

防止重复执行的两种思维 场景 下单时,提交按钮,因为网络卡顿或者手快重复点击,导致重复提交订单; 微博,更新个人状态或发表评论时,快速多次点击[发送]按钮,导致相同的信息发送多次. 解决思路 ...

黄威
今天
0
0
在windows环境下使用Virtualbox虚拟Debian系统来运行Docker

标题绕口。 我之前一直使用 Virtualbox 和 homestead 来运行我的 PHP 开发环境。最近决心开始尝试 DevOps,使得开发、部署容器化,来化解人为操作失误和环境不兼容等问题造成的各种损失。就打...

zgldh
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部