文档章节

ElasticSearch 2 Plugin 插件开发

南湖船老大
 南湖船老大
发布于 2016/10/02 12:16
字数 871
阅读 389
收藏 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
深圳
其他
私信 提问
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
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
windows下安装elasticsearch-1.7.1

首先下载最新的elasticsearch安装版本。本人使用最新版elasticsearch-1.7.1。 https://www.elastic.co/downloads/elasticsearch 下载完成后。解压缩在安装目录。 在cmd命令行进入安装目录,再...

Leons
2015/08/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Confluence 6 自定义你的空间

通过对你的空间进行界面的自定义能够让你的空间更加出类拔萃。 如果你具有空间管理员权限,你可以修改你空间的颜色配色,添加你自己的空间标识,选择是否在你空间中显示边栏。或者你可以进入...

honeymose
今天
1
0
Ubuntu18.04 安装MySQL

1.安装MySQL sudo apt-get install mysql-server 2.配置MySQL sudo mysql_secure_installation 3.设置MySQL非root用户 设置原因:配置过程为系统root权限,在构建MySQL连接时出现错误:ERROR...

AI_SKI
今天
3
0
3.6 rc脚本(start方法) 3.7 rc脚本(stop和status方法) 3.8 rc脚本(以daemon方式启动)

3.6-3.7 rc脚本(start、stop和status方法) #!/usr/bin/env python# -*- coding: utf-8 -*-# [@Version](https://my.oschina.net/u/931210) : python 2.7# [@Time](https://my.oschina.......

隐匿的蚂蚁
今天
3
0
Cnn学习相关博客

CNN卷积神经网络原理讲解+图片识别应用(附源码) 笨方法学习CNN图像识别系列 深度学习图像识别项目(中):Keras和卷积神经网络(CNN) 卷积神经网络模型部署到移动设备 使用CNN神经网络进行...

-九天-
昨天
5
0
flutter 底部输入框 聊天输入框 Flexible

想在页面底部放个输入框,结果键盘一直遮住了,原来是布局问题 Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("评论"), ...

大灰狼wow
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部