ES系统作为集群,环境搭建非常方便简单。 现在在我们的应用中,如何对这个集群进行操作呢?

我们利用ES系统,通常都是下面的架构:

在这里,客户端的请求通过LB进行负载均衡,因为操作任何一个ES的实例,最终在ES集群系统中内容都是一样的,所以,考虑各个ES节点的负载问题以及容灾问题,上述的架构是当下最流行的方式。

下面,将要介绍ES JAVA REST API方式操作ES集群。

若是通过maven项目操作,相对比较简单的,只需要在pom.xml下面加入下面的配置

 <dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>rest</artifactId>
<version>5.0.-rc1</version>
</dependency>

但是,我们公司网络让人蛋疼,maven仓库基本连接不上,所以,我们不得不采用Dynamic Web Project的方式,所以,需要的ES客户端jar包需要自己下载了。大家可以在maven的网站上一个个的下载,主要是依赖下载,可以在rest的下载地址下面,找到这个包的依赖文件,其实,就是httpclient的一些jar包。

 commons-codec
commons-logging
httpclient
httpcore
httpasyncclient
httpcore-nio

这些包,都不大,下载后放在自己的工程lib下面即可。

我在项目TKSearch里面创建了一个测试用的controller文件SearchProducerController,然后在service下面创建一个接口文件IESRestService.java,并做相关实现ESRestService.java. 代码如下:

IESRestService.java

 /**
* @author "shihuc"
* @date 2016年10月26日
*/
package com.tk.es.search.service; import org.apache.http.HttpEntity; /**
* @author chengsh05
*
*/
public interface IESRestService { /**
* 同步方式向ES集群写入数据
*
* @param index
* @param type
* @param id
* @param entity
* @return
*/
public boolean putSync(String index, String type, String id, HttpEntity entity); /**
* 异步的方式向ES写入数据
*
* @param index
* @param type
* @param id
* @param entity
* @return
*/
public void putAsync(String index, String type, String id, HttpEntity entity); }

ESRestService.java

 /**
* @author "shihuc"
* @date 2016年10月26日
*/
package com.tk.es.search.service.impl; import java.io.IOException;
import java.util.Collections; import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy; import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.elasticsearch.client.Response;
import org.elasticsearch.client.ResponseListener;
import org.elasticsearch.client.RestClient;
import org.springframework.stereotype.Service; import com.tk.es.search.service.IESRestService; /**
* @author chengsh05
*
*/
@Service
public class ESRestService implements IESRestService{ private RestClient restClient = null; /* (non-Javadoc)
* @see com.tk.es.search.service.IESRestService#putSync(java.lang.String, java.lang.String, java.lang.String, org.apache.http.HttpEntity)
*/
@Override
public boolean putSync(String index, String type, String id, HttpEntity entity) {
Response indexResponse = null;
try {
indexResponse = restClient.performRequest(
"PUT",
"/" + index + "/" + type + "/" + id,
Collections.<String, String>emptyMap(),
entity);
} catch (IOException e) {
e.printStackTrace();
}
return (indexResponse != null);
} @PostConstruct
public void init(){
restClient = RestClient.builder(new HttpHost("10.90.7.2", , "http")).build(); #这里builder的参数,可以是很多个HttpHost的数组,若采用博文开篇的架构图的话,这里的HttpHost就是LB的的地址
} @PreDestroy
public void destroy(){
if(restClient != null){
try {
restClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} /* (non-Javadoc)
* @see com.tk.es.search.service.IESRestService#putAsync(java.lang.String, java.lang.String, java.lang.String, org.apache.http.HttpEntity)
*/
@Override
public void putAsync(String index, String type, String id, HttpEntity entity) { restClient.performRequestAsync(
"PUT",                        #HTTP的方法,可以是PUT,POST,DELETE,HEAD,GET等
"/" + index + "/" + type + "/" + id,       #endpoint, 这个就是指数据在ES中的位置,由index,type以及id确定
Collections.<String, String>emptyMap(),     #是一个map
entity,                        #指的是操作数,即目标数据,这个例子里面表示要存入ES的数据对象
new ResponseListener() {              #异步操作的监听器,在这里,注册listener,对操作成功或者失败进行后续的处理,比如在这里向前端反馈执行后的结果状态
@Override
public void onSuccess(Response response) {
System.out.println(response);
} @Override
public void onFailure(Exception exception) {
System.out.println("failure in async scenrio");
}
}); } }

SearchProducerController.java

 /**
* @author "shihuc"
* @date 2016年10月26日
*/
package com.tk.es.search.controller; import java.util.HashMap; import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.http.HttpEntity;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody; import com.google.gson.Gson;
import com.tk.es.search.service.impl.ESRestService; /**
* @author chengsh05
*
*/
@Controller
public class SearchProducerController { @Resource
private ESRestService esRestService; @RequestMapping(value="/articleSync")
@ResponseBody
public String prepareArticleSync(HttpServletRequest req, HttpServletResponse rsp){
HttpEntity entity = new StringEntity(
"{\n" +
" \"user\" : \"kimchy\",\n" +
" \"post_date\" : \"2009-11-15T14:12:12\",\n" +
" \"message\" : \"trying out Elasticsearch\"\n" +
"}", ContentType.APPLICATION_JSON); esRestService.putSync("rest_index", "client", "", entity);
Gson gson = new Gson();
HashMap<String, String> res = new HashMap<String, String>();
res.put("result", "successful");
return gson.toJson(res);
} @RequestMapping(value="/articleAsync")
@ResponseBody
public String prepareArticleAsync(HttpServletRequest req, HttpServletResponse rsp){
HttpEntity entity = new StringEntity(
"{\n" +
" \"user\" : \"shihuc\",\n" +
" \"post_date\" : \"2016-10-26T13:30:12\",\n" +
" \"message\" : \"Demo REST Client to operate Elasticsearch\"\n" +
"}", ContentType.APPLICATION_JSON); esRestService.putAsync("rest_index", "client", "", entity);
Gson gson = new Gson();
HashMap<String, String> res = new HashMap<String, String>();
res.put("result", "successful");
return gson.toJson(res);
}
}

启动项目,在地址栏输入http://10.90.9.20:8080/TKSearch/articleSync将会以同步的方式在ES集群中创建一条记录。

输入http://10.90.9.20:8080/TKSearch/articleAsync,将会以异步的方式创建一个记录。

将RestClient以一个Service进行包装,在Spring启动的时候,注入bean过程中进行初始化,在bean销毁前进行连接的关闭操作。利用Spring支持的两个注解@PostConstruct和@PreDestroy完成连接的建立和销毁,结构干净简单。

到此,客户端以Java REST Client的方式操作ES集群的demo就演示结束。 后续将介绍Elasticsearch Java API的方式操作ES集群的实施过程。

Elasticsearch【JAVA REST Client】客户端操作的更多相关文章

  1. Elasticsearch Java Rest Client API 整理总结 (二) —— SearchAPI

    目录 引言 Search APIs Search API Search Request 可选参数 使用 SearchSourceBuilder 构建查询条件 指定排序 高亮请求 聚合请求 建议请求 R ...

  2. Elasticsearch Java Rest Client API 整理总结 (三)——Building Queries

    目录 上篇回顾 Building Queries 匹配所有的查询 全文查询 Full Text Queries 什么是全文查询? Match 全文查询 API 列表 基于词项的查询 Term Term ...

  3. Elasticsearch Java Rest Client API 整理总结 (一)——Document API

    目录 引言 概述 High REST Client 起步 兼容性 Java Doc 地址 Maven 配置 依赖 初始化 文档 API Index API GET API Exists API Del ...

  4. Elasticsearch Java Rest Client简述

    ESJavaClient的历史 JavaAPI Client 优势:基于transport进行数据访问,能够使用ES集群内部的性能特性,性能相对好 劣势:client版本需要和es集群版本一致,数据序 ...

  5. java web 获取客户端操作系统信息

    package com.java.basic.pattern; import java.util.regex.Matcher; import java.util.regex.Pattern; /** ...

  6. 使用Jedis操作Redis-使用Java语言在客户端操作---set类型

    原文地址:http://www.cnblogs.com/lixianyuan-org/p/9509696.html 1 //测试set数据类型 2 /** 3 * 在Redis中,我们可以将Set类型 ...

  7. 使用Jedis操作Redis-使用Java语言在客户端操作---对Sorted-Sets的操作

    //对Sorted-Sets操作 /** * Sorted-Sets和Sets类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中. * 它们之间的主要差别是Sorted-Sets ...

  8. 使用Jedis操作Redis-使用Java语言在客户端操作---hash类型

        我们可以将Redis中的Hashes类型看成具有String Key和String Value的map容器.            所以该类型非常适合于存储值对象的信息.如Username.P ...

  9. 使用Jedis操作Redis-使用Java语言在客户端操作---List类型

    在Redis中,List类型是按照插入顺序排序的字符串链表.和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素.在插入时,如果该键并不存在,Redis将为该键创建 ...

  10. 使用Jedis操作Redis-使用Java语言在客户端操作---String类型

    前提:需要引入Jedis的jar包. /** * 我的redis在Linux虚拟机Centos7中,192.168.222.129是我虚拟机的ip地址. */ private static Jedis ...

随机推荐

  1. 操作系统和程序设计语言的API使用的字符编码分析

     1.Java的运行环境中,String是什么编码? 使用java做程序设计语言,字符编码是和jvm相关的,和操作系统无关. java默认的编码是jvm在安装的时候就确定了的,它是根据你的系统的环境确 ...

  2. 设置Ubuntu为本地时间

    大家在切换操作系统的时候会发现一个问题, Windows 和 Ubuntu 的时间会出现不一致的情况.在 Windows 中把时间设置正确了过后,回到在 Ubuntu 后系统的时间又不一样了,在 Ub ...

  3. position属性的四个value

    As we all know, position属性有四个值,分别为 relative,fixed,absolute, static. 1,relative相对定位 (不会脱离文档流) 在一个相对定位 ...

  4. 通过a++来理解闭包改变作用域的问题

    纯属个人理解,如果有误请指出! 让我们先看一段代码 function dog(){ var a=100; a++; return a; } alert(dog()); alert(dog()); 我们 ...

  5. .NET微信模拟登录及{base_resp:{ret:-4,err_msg:nvalid referrer}}的解决办法

    12年的时候写了些关于微信开发的内容,当时看好这个东西,可惜当时腾讯开放的权限太少,之后的一年多时间没有太关注了. 现在又要重新开始微信开发的阵容了,微信只是个入口,微网站才是趋势. 我是个水货,所以 ...

  6. javascript运动应用

    多物体运动框架: 1.多个盒子同时运动:move(obj,target)多一个参数 <!DOCTYPE html><html><head> <title> ...

  7. esxi 6 虚拟机安装复制

    打开VMware vSphere Client 连接到esxi服务器,选择配置-存储器, 右击存储器标识,选择浏览存储数据, 首先新建一个文件夹,用来存放系统镜像,这里新建了iso文件夹, 选择iso ...

  8. JS小总结

    今天看了一下js的部分总结了一下 函数的定义首先是命名函数function funcName函数还有匿名函数 var funcName = function()普通函数和匿名函数在调用上基本没有什么区 ...

  9. 关于 jsp 解析特殊字符的问题

    在项目中了 使用了一个UI封装好 的插件 经测试了可以返回一些特殊字符,但是因为是特殊字符,导致了jsp解析出错,使用了Jquery来添加了dom结构,添加完之后,Ui控件进行初始化的时候报错了,原因 ...

  10. adb获取不了设备List of devices attached

    方法/步骤: 首先找到手机的安装完之后的“设备的硬件id”,第一步右击我的电脑,然后找到设备管理器打开. 在设备管理器中,找到ADB driver然后点开. 然后在详细信息中,点开硬件ID,查看到我的 ...