elasticsearch插件开发
2015-07-22 16:21
239 查看
检索引擎Elasticsearch支持插件模式,有些时候你可能需要安装一些插件,甚至自己开发插件,这里就提供一个开始ES插件开发示例,ES版本为5.2.0。
一、插件类继承自org.elasticsearch.plugins.AbstractPlugin
Module类其实就是定义了依赖注入规则,如果不清楚,可以去查看Google Guice的文档,基本上是一致的。如上例中的HelloModule:
不同的模块有不同的处理方式,例如例子中对于RestModule,添加了一个Handler:
最后在类路径根目录下添加一个名为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就可以完成相应的功能了。
一、插件类继承自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就可以完成相应的功能了。
相关文章推荐
- HSP Profile注册过程(未完成)
- js中,符合属性的js写法是讲下横杆去掉
- 虚拟机连接上网
- 大白话系列之C#委托与事件讲解(一)
- static关键字详解——static与非static的区别
- HTTP 协议漫谈
- webbench,linux下并发测试工具
- 恭喜你们啊
- C++版修真小说
- 安装Alcatraz插件管理
- 对于一个IE8兼容性问题的反思
- vsftp 建立虚拟用户服务器
- NOR Flash、NAND Flash和iNAND Flash的不同点
- Sublime Text 3 常用插件以及安装方法
- HDOJ 剪花布条 2087【KMP】
- 多校第一场 1005 hdu 5292 Pocket Cube(数学题)
- ios基本概念学习
- warning:iCCP:known incorrect sRGB profile
- Java 字符串移位
- 区间覆盖,选点