elasticsearch插件开发

检索引擎Elasticsearch支持插件模式,有些时候你可能需要安装一些插件,甚至自己开发插件,这里就提供一个开始ES插件开发示例,ES版本为5.2.0。

一、插件类继承自org.elasticsearch.plugins.AbstractPlugin

package org.elasticsearch.plugin.helloworld;

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.AbstractPlugin;
import org.elasticsearch.rest.RestModule;

public class HelloWorldPlugin extends AbstractPlugin {
	final ESLogger logger = Loggers.getLogger(getClass());

	@Override
	public String name() {
		//插件名称
		return "HelloWorld";
	}

	@Override
	public String description() {
		//插件描述
		return "Hello World Plugin";
	}

	//处理模块,因为系统中有很多种Module,所以需要对其类型进行判断
	@Override
	public void processModule(Module module) {
		if(module instanceof RestModule) {
			((RestModule)module).addRestAction(HelloWorldHandler.class);
		}

		if(module instanceof HelloModule) {
			logger.info("############## process hello module #####################");
		}
	}

	@Override
	public Collection<Module> modules(Settings settings) {
		//创建自己的模块集合
		//如果没有自定义模块,则可以返回空
		HelloModule helloModule = new HelloModule();
		ArrayList<Module> list = new ArrayList<>();
		list.add(helloModule);
		Collections.unmodifiableList(list);
		return list;
	}

	@SuppressWarnings("rawtypes")
	@Override
	public Collection<Class<? extends LifecycleComponent>> services() {
		//创建自己的服务类集合,服务类需要继承自LifecycleComponent,ES会自动创建出服务类实例,并调用其start方法
		//如果没有自定义服务类,则可以返回空
		Collection<Class<? extends LifecycleComponent>> list = new ArrayList<>();
		list.add(HelloService.class);
		return list;
	}

}

Module类其实就是定义了依赖注入规则,如果不清楚,可以去查看Google Guice的文档,基本上是一致的。如上例中的HelloModule:

package org.elasticsearch.plugin.helloworld;

import org.elasticsearch.common.inject.AbstractModule;
import org.elasticsearch.common.inject.Scopes;

public class HelloModule extends AbstractModule {

	@Override
	protected void configure() {
		//将InjectableService接口类型绑定到InjectableServiceImpl实现类
		//在需要注入InjectableService的地方,就会使用InjectableServiceImpl实例
		bind(InjectableService.class).to(InjectableServiceImpl.class);
		//使HelloService为单例状态
		bind(HelloService.class).in(Scopes.SINGLETON);
	}

}

不同的模块有不同的处理方式,例如例子中对于RestModule,添加了一个Handler:

package org.elasticsearch.plugin.helloworld;

import org.elasticsearch.client.Client;
import org.elasticsearch.common.inject.Inject;
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.RestStatus;
import org.elasticsearch.rest.RestRequest.Method;
import org.elasticsearch.rest.RestResponse;

public class HelloWorldHandler extends BaseRestHandler {

	//注入对象
    @Inject
    protected 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
	protected 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);
	}
}

最后在类路径根目录下添加一个名为es-plugin.properties属性文件,指定插件实现类:

plugin=org.elasticsearch.plugin.helloworld.HelloWorldPlugin

二、将插件打成jar包后安装

假设ES_HOME代表Elasticsearch安装目录。在ES_HOME/plugins目录下创建一个名为HelloWorld的目录,该目录名称必须与插件名称相同(区分大小写),然后将jar包拷贝至HelloWorld目录,重新启动即可,当你执行:

curl -GET localhost:9200/hello,就会返回相应结果了。

三、为插件添加页面

如果你想为你的插件添加访问页面,则可以在ES_HOME/plugins/HelloWorld目录下创建一个名为"_site"的目录,该目录名称必须为_site,然后将相应的html页面放置进_site目录即可,如果放置了一个名为index.html文件,则可以通过

localhost:9200/_plugin/HelloWorld/index.html进行访问。

由于Elasticsearch提供了js客户端API,所以使用html静态页面与js就可以完成相应的功能了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 23:59:31

elasticsearch插件开发的相关文章

Elasticsearch( 插件开发)

Elasticsearch源码5(2.x插件开发) Elasticsearch源码5(2.x插件开发) Elasticsearch源码6(5.4插件开发)

elasticsearch 自定义similarity 插件开发

原文  http://www.cnblogs.com/luanfei/p/4029442.html 主题 Elastic Search 转自: http://www.chepoo.com/elasticsearch-similarity-custom-plug-in-development.html 在搜索开发中,我们要修改打分机制,就需要自定义similarity.现在来简单说一下elasticsearch下的自定义similarity 插件开发. 网上的 https://github.com

ElasticSearch的ik分词插件开发

摘要 本文主要介绍如何开发ElasticSearch的ik分词插件.很多时候,网上开源的分词插件不能满足业务需求,只能自己定义开发一套ik分词,let's go! ik插件,说白了,就是通过封装ik分词器,与ElasticSearch对接,让ElasticSearch能够驱动该分词器.那么,具体怎么与ElasticSearch对接呢?从下往上走,总共3步: 一.封装IK分析器 与ElasticSearch集成,分词器的配置均从ElasticSearch的配置文件读取,因此,需要重载IKAnaly

ElasticSearch 5.4 自定义插件

ElasticSearch 做为数据仓库处理速度确实很强,但是很多和业务相关的函数ElasticSearch怎么支持的,通过查询发现,ElasticSearch支持自定义插件(相当于自定义函数),通过自定义插件,开发人员可以实现各种业务相关的函数定义供相关人员使用. 1.   ElasticSearch  自定义插件编写 后续补充. 2.  ElasticSearch  自定义插件打包 2.1  自定义插件开发完成后,需要增加“plugin-descriptor.properties”配置文件,

Elasticsearch5.5.1插件开发指南

Elasticsearch5.5.1插件开发指南 原文地址: https://www.elastic.co/guide/en/elasticsearch/plugins/5.5/plugin-authors.html#_plugin_descriptor_file 本文为博主原创翻译,转载需请示.特别是http://www.mamicode.com/  码迷   这类垃圾网站. Elasticsearch库包含了一些示例 一个包含Java代码的Java插件.这些例子提供了开始的必要的内容.关于如

ElasticSearch

一.概述 1.简介 ElasticSearch是一个基于Lucene实现的开源.分布式.Restful的全文本搜索引擎:此外,它还是一个分布式实时文档存储,其中每个文档的每个field均是被索引的数据,且可被搜索:也是一个带实时分析功能的分布式搜索引擎,能够扩展至数以百计的节点实时处理PB级的数据. 应用场景:当我们建立一个网站或应用程序,并要添加搜索功能,但是想要完成搜索工作的创建是非常困难的.我们希望搜索解决方案要运行速度快.能有一个零配置和一个完全免费的搜索模式.能够简单地使用JSON通过

学习elasticsearch(一)linux环境搭建(2)——启动elasticsearch

在启动访问es的过程中遇到了各种的奇葩问题. 1.网上各种版本的启动方式让人眼花缭乱不知如何启动.简单粗暴--到es的bin目录下直接 执行 ./elasticsearch //显示启动,ctrl+c可停止,如要操作,换个终端 ./elasticsearch -d 后台启动,可在当前终端继续操作 //后台启动,如要停止执行 kill -9 pid //哈哈,直接杀掉进程 //搜索es进程pid可以酱紫 ps aux | grep elasticsearch //注意,不确定那个是pid的话多执行

ELK学习笔记(一)安装Elasticsearch、Kibana、Logstash和X-Pack

最近在学习ELK的时候踩了不少的坑,特此写个笔记记录下学习过程. 日志主要包括系统日志.应用程序日志和安全日志.系统运维和开发人员可以通过日志了解服务器软硬件信息.检查配置过程中的错误及错误发生的原因.经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误. 通常,日志被分散的储存不同的设备上.如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志.这样是不是感觉很繁琐和效率低下.当务之急我们使用集中化的日志管理,例如:开源的syslog,将所有服务器上的日志收

elasticsearch index 之 put mapping

mapping机制使得elasticsearch索引数据变的更加灵活,近乎于no schema.mapping可以在建立索引时设置,也可以在后期设置.后期设置可以是修改mapping(无法对已有的field属性进行修改,一般来说只是增加新的field)或者对没有mapping的索引设置mapping.put mapping操作必须是master节点来完成,因为它涉及到集群matedata的修改,同时它跟index和type密切相关.修改只是针对特定index的特定type. 在Action su