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. Python学习之运算符

    Python运算符 算术运算符 运算符 描述 + 相加 - 相减 * 相乘 / 相除 % 取模 ** 幂 // 整除 比较运算符 运算符 描述 == 等于 != 不等于 <> 不等于 &g ...

  2. 什么是web service

    一.序言 大家或多或少都听过WebService(Web服务),有一段时间很多计算机期刊.书籍和网站都大肆的提及和宣传WebService技术,其中不乏很多吹嘘和做广告的成分.但是不得不承认的是Web ...

  3. 使用Cargo实现自动化部署

    Cargo是一组帮助用户操作Web容器的工具,它能帮助用户实现自动化部署,而且它几乎支持所有的Web容器,如Tomcat.JBoss.Jetty和Glassfish.Cargo通过cargo-mave ...

  4. C# 类:类型 , 数学:类型

    类(类型):   //.Length:获取字符串的长度,返回int型                        //.Trim去除字符串前后的空格                        / ...

  5. 《看板与Scrum》读书笔记

    看板的朴素思想:在制品(work-in-progress, WIP)必须被限制 WIP上限和拉动式生产 1. Scrum与看板简述 Scrum:组织拆分,工作拆分,开发时间拆分,优化发布计划,过程优化 ...

  6. New Training Table

          2014_8_15 CodeForces 261 DIV2 A. Pashmak and Garden 简单题   B. Pashmak and Flowers    简单题   C. P ...

  7. 如何让iOS 保持界面流畅?这些技巧你知道吗

    如何让iOS 保持界面流畅?这些技巧你知道吗   作者:ibireme这篇文章会非常详细的分析 iOS 界面构建中的各种性能问题以及对应的解决思路,同时给出一个开源的微博列表实现,通过实际的代码展示如 ...

  8. 重复发起Volley请求不要使用同一对象

    1.创建volley请求Request request = new JsonObjectRequest(...); 2.添加到队列中mRequestQueue.add(request); reques ...

  9. 0x00到0xFF二进制数值中1的的个数

    似乎有点无聊耶~~~~~(>_<)~~~~ #include <stdio.h> , , , , , , , , , , , , , , , }; ] = { , , , , ...

  10. linux grep,sed,awk和diff的使用

    1:grep//显示行 # grep 'main' /home/myhome/a.c//将a.c含有main的行显示出来 # grep -v 'main' /home/myhome/a.c //显示除 ...