elasticsearch插件开发教程
发布时间 - 2026-01-11 02:06:05 点击率:次检索引擎Elasticsearch支持插件模式。有些时候你可能须要安装一些插件。甚至自己开发插件,这里就提供一个開始ES插件开发演示样例,ES版本号为1.5.2。

一、插件类继承自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提供了jsclientAPI。所以使用html静态页面与js就能够完毕对应的功能了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# elasticsearch
# 插件开发
# ElasticSearch6.2.3+head插件安装的方法步骤
# Java elasticsearch安装以及部署教程
# Elasticsearch插件及nodejs的安装配置
# 自己的
# 则能
# 就会
# 绑定
# 创建一个
# 就可以
# 样例
# 当你
# 中有
# 你想
# 不清楚
# 对其
# 提供一个
# 将该
# 大家多多
# 事实上
# 文档
# void
# org
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法
html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】
Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优
如何在腾讯云服务器快速搭建个人网站?
如何在IIS服务器上快速部署高效网站?
Python文件异常处理策略_健壮性说明【指导】
青岛网站建设如何选择本地服务器?
标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南
phpredis提高消息队列的实时性方法(推荐)
Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】
php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】
如何快速搭建高效WAP手机网站?
如何基于云服务器快速搭建网站及云盘系统?
Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析
php增删改查怎么学_零基础入门php数据库操作必知基础【教程】
如何彻底删除建站之星生成的Banner?
南京网站制作费用,南京远驱官方网站?
Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境
如何快速搭建二级域名独立网站?
今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】
网站制作大概多少钱一个,做一个平台网站大概多少钱?
在线制作视频网站免费,都有哪些好的动漫网站?
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验
lovemo网页版地址 lovemo官网手机登录
米侠浏览器网页背景异常怎么办 米侠显示修复
Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南
Python进程池调度策略_任务分发说明【指导】
Laravel如何创建和注册中间件_Laravel中间件编写与应用流程
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
浅谈javascript alert和confirm的美化
Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案
如何在万网自助建站中设置域名及备案?
EditPlus 正则表达式 实战(3)
如何获取免费开源的自助建站系统源码?
如何续费美橙建站之星域名及服务?
Win11怎么开启自动HDR画质_Windows11显示设置HDR选项
Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程
香港服务器建站指南:免备案优势与SEO优化技巧全解析
网页设计与网站制作内容,怎样注册网站?
长沙做网站要多少钱,长沙国安网络怎么样?
LinuxShell函数封装方法_脚本复用设计思路【教程】
Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程
移动端脚本框架Hammer.js
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
详解jQuery停止动画——stop()方法的使用
JavaScript实现Fly Bird小游戏
Laravel Seeder填充数据教程_Laravel模型工厂Factory使用

