文档章节

ElasticSearch 2 Plugin 插件开发

南湖船老大
 南湖船老大
发布于 2016/10/02 12:16
字数 871
阅读 290
收藏 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

© 著作权归作者所有

共有 人打赏支持
南湖船老大
粉丝 678
博文 11
码字总数 10246
作品 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入门 —— 集群搭建

一、环境介绍与安装准备 1、环境说明 2台虚拟机,OS为ubuntu13.04,ip分别为xxx.xxx.xxx.140和xxx.xxx.xxx.145。 2、安装准备 ElasticSearch(简称ES)由java语言实现,运行环境依赖java。E...

萧十一郎君
2014/04/30
0
3
分布式搜索引擎Elasticsearch安装配置

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

汪兴
2015/04/01
0
0
Elasticsearch笔记(一)—Elasticsearch安装配置

一、安装Elasticsearch ·安装Elasticsearch唯一的要求是安装官方新版的Java,地址:http://www.java.com/ ·java安装配置:http://jingyan.baidu.com/article/e75aca85b29c3b142edac6a8.htm...

j_hao104
2016/03/22
0
3

没有更多内容

加载失败,请刷新页面

加载更多

下一页

qduoj~前端~二次开发~打包docker镜像并上传到阿里云容器镜像仓库

上一篇文章https://my.oschina.net/finchxu/blog/1930017记录了怎么在本地修改前端,现在我要把我的修改添加到部署到本地的前端的docker容器中,然后打包这个容器成为一个本地镜像,然后把这...

虚拟世界的懒猫
今天
1
0
UML中 的各种符号含义

Class Notation A class notation consists of three parts: Class Name The name of the class appears in the first partition. Class Attributes Attributes are shown in the second par......

hutaishi
今天
1
0
20180818 上课截图

小丑鱼00
今天
1
0
Springsecurity之SecurityContextHolderStrategy

注:下面分析的版本是spring-security-4.2.x,源码的github地址是: https://github.com/spring-projects/spring-security/tree/4.2.x 先上一张图: 图1 SecurityContextHolderStrategy的三个......

汉斯-冯-拉特
今天
1
0
LNMP架构(Nginx负载均衡、ssl原理、生成ssl密钥对、Nginx配置ssl)

Nginx负载均衡 网站的访问量越来越大,服务器的服务模式也得进行相应的升级,比如分离出数据库服务器、分离出图片作为单独服务,这些是简单的数据的负载均衡,将压力分散到不同的机器上。有时...

蛋黄_Yolks
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部