java rest client 有两种:

  1、Java Low Level REST Client :用于Elasticsearch的官方低层客户端。它允许通过http与Elasticsearch集群通信。叶子请求编组,响应反编组给用户。它兼容所有的Elasticsearch版本。

  2、Java High Level REST Client :Elasticsearch的官方高级客户端。它基于底层客户端,公开API特定的方法,处理请求编组和响应反编组。

一、Java Low Level REST Client

  1、先引入jar包

  1.   <dependency>
  2. <groupId>org.elasticsearch.client</groupId>
  3. <artifactId>elasticsearch-rest-client</artifactId>
  4. <version>6.6.0</version>
  5. </dependency>

  2、编写代码

  1. public class LowLevelRestClientTest {
  2.  
  3. //RequestOptions类包含请求的一些部分,这些部分应该在同一个应用程序中的多个请求之间共享。你可以创建一个单实例,并在所有请求之间共享:
  4. private static final RequestOptions COMMON_OPTIONS;
  5. static {
  6. RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
  7. builder.addHeader("Authorization", "kyle " + "TOKEN");
  8. builder.setHttpAsyncResponseConsumerFactory(
  9. new HttpAsyncResponseConsumerFactory
  10. .HeapBufferedResponseConsumerFactory(200*1024*1024));
  11. COMMON_OPTIONS = builder.build();
  12. }
  13.  
  14. public static RestClient buildRestClient(){
  15. //创建RestClientBuilder
  16. RestClientBuilder builder = RestClient.builder(
  17. new HttpHost("localhost",9201,"http"),
  18. new HttpHost("localhost",9202,"http"),
  19. new HttpHost("localhost",9203,"http")
  20. );
  21. //在创建restClient的同时,设置每个请求需要发送的默认头文件,以避免在每个请求中指定它们
  22. Header[] defaultHeaders = new Header[]{new BasicHeader("header", "value")};
  23. builder.setDefaultHeaders(defaultHeaders);
  24. //设置应该遵守的超时,以防对同一个请求进行多次尝试,默认为3000ms.
  25. builder.setMaxRetryTimeoutMillis(1000);
  26. //设置一个监听器,用来在节点发生故障的时候,采取相应的操作。
  27. builder.setFailureListener(new RestClient.FailureListener(){
  28. @Override
  29. public void onFailure(Node node) {
  30. super.onFailure(node);
  31. //doSomeThing();
  32. }
  33. });
  34. //将节点选择器设置为用于过滤客户机将发送请求到的节点之间的节点,这些节点被设置为客户机本身。
  35. //这对于防止在启用嗅探时将请求发送到专用的主节点非常有用。默认情况下,客户机向每个配置的节点发送请求
  36. builder.setNodeSelector(NodeSelector.SKIP_DEDICATED_MASTERS);
  37. //设置一个回调函数,允许修改默认的请求配置
  38. /*builder.setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback() {
  39.  
  40. @Override
  41. public Builder customizeRequestConfig(Builder arg0) {
  42. return null;
  43. }
  44. });*/
  45.  
  46. //设置一个回调,允许修改http客户机配置
  47. /*builder.setHttpClientConfigCallback(new HttpClientConfigCallback(){
  48.  
  49. @Override
  50. public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder arg0) {
  51. return null;
  52. }
  53.  
  54. });*/
  55.  
  56. //创建restClient,中间的那些配置也可以不设置
  57. RestClient restClient = builder.build();
  58.  
  59. return restClient;
  60. }
  61.  
  62. public static void request(RestClient restClient) throws ParseException, IOException{
  63. //创建一个请求组
  64. Request request = new Request("GET","/_search");
  65. //为请求添加一些参数
  66. request.addParameter("pretty", "true");
  67.  
  68. //请求的主体设置为任何HttpEntity,
  69. //为HttpEntity指定的ContentType非常重要,因为它将用于设置content - type头部,以便Elasticsearch能够正确解析内容。
  70. //request.setEntity(new NStringEntity("{\"json\":\"text\"}",ContentType.APPLICATION_JSON));
  71.  
  72. //还可以将其设置为一个字符串,该字符串将默认为application/json的ContentType。
  73. request.setJsonEntity("{\"query\": {\"match\": {\"address\": \"Street\"}}}");
  74.  
  75. //非必须
  76. request.setOptions(COMMON_OPTIONS);
  77.  
  78. //发送一个同步的请求,线程会阻塞
  79. Response response = restClient.performRequest(request);
  80.  
  81. //发送异步请求,然后使用监听器来对返回结果进行处理
  82. /*restClient.performRequestAsync(request, new ResponseListener() {
  83.  
  84. @Override
  85. public void onSuccess(Response resp) {
  86. System.out.println("成功");
  87. }
  88.  
  89. @Override
  90. public void onFailure(Exception arg0) {
  91. System.out.println("失败");
  92. }
  93. });*/
  94.  
  95. //有关已执行请求的信息
  96. RequestLine requestLine = response.getRequestLine();
  97. //返回响应的主机
  98. HttpHost host = response.getHost();
  99. //响应状态行,您可以从中检索状态代码
  100. int statusCode = response.getStatusLine().getStatusCode();
  101. //响应头
  102. Header[] headers = response.getHeaders();
  103.  
  104. String responseBody = EntityUtils.toString(response.getEntity());
  105.  
  106. System.out.println(requestLine.getUri());
  107. System.out.println(host);
  108. System.out.println(statusCode);
  109. System.out.println(headers);
  110. System.out.println(responseBody);
  111.  
  112. }
  113.  
  114. public static void main(String[] args) throws IOException {
  115. RestClient restClient = buildRestClient();
  116. request(restClient);
  117. //关闭restClient
  118. restClient.close();
  119. }

  

  3、RequestConfigCallback 和 HttpClientConfigCallback 的一些常用的配置

  RequestConfigCallback和HttpClientConfigCallback允许Apache Async Http客户机公开的任何定制。这些回调使修改客户机的某些特定行为成为可能,而无需覆盖使用RestClient初始化的所有其他默认配置。本节描述一些常见的场景,这些场景需要对底层Java REST客户机进行额外的配置。

  3.1、身份验证

  1. final CredentialsProvider credentialsProvider =
  2. new BasicCredentialsProvider();
  3. credentialsProvider.setCredentials(AuthScope.ANY,
  4. new UsernamePasswordCredentials("user", "password"));
  5.  
  6. RestClientBuilder builder = RestClient.builder(
  7. new HttpHost("localhost", 9200))
  8. .setHttpClientConfigCallback(new HttpClientConfigCallback() {
  9. @Override
  10. public HttpAsyncClientBuilder customizeHttpClient(
  11. HttpAsyncClientBuilder httpClientBuilder) {
  12. //httpClientBuilder.disableAuthCaching(); ①
  13. return httpClientBuilder
  14. .setDefaultCredentialsProvider(credentialsProvider);
  15. }
  16. });

  ①可以禁用抢占式身份验证,这意味着每个请求都将在没有授权头的情况下发送,以查看它是否被接受,并且在接收到HTTP 401响应后,它将使用基本身份验证头重新发送完全相同的请求。

  3.2、默认情况下,Apache Http Async客户机启动一个dispatcher线程和连接管理器使用的多个工作线程,以及本地检测到的处理器的数量(取决于Runtime.getRuntime(). availableprocessors()返回的是什么)。线程数可以修改如下:

  1. RestClientBuilder builder = RestClient.builder(
  2. new HttpHost("localhost", 9200))
  3. .setHttpClientConfigCallback(new HttpClientConfigCallback() {
  4. @Override
  5. public HttpAsyncClientBuilder customizeHttpClient(
  6. HttpAsyncClientBuilder httpClientBuilder) {
  7. return httpClientBuilder.setDefaultIOReactorConfig(
  8. IOReactorConfig.custom()
  9. .setIoThreadCount(1)
  10. .build());
  11. }
  12. });

  3.3、设置链接超时或者socket超时

  1. RestClientBuilder builder = RestClient.builder(
  2. new HttpHost("localhost", 9200))
  3. .setRequestConfigCallback(
  4. new RestClientBuilder.RequestConfigCallback() {
  5. @Override
  6. public RequestConfig.Builder customizeRequestConfig(
  7. RequestConfig.Builder requestConfigBuilder) {
  8. return requestConfigBuilder
  9. .setConnectTimeout(5000)
  10. .setSocketTimeout(60000);
  11. }
  12. })
  13. .setMaxRetryTimeoutMillis(60000);

  3.4、加密传输

  1. KeyStore truststore = KeyStore.getInstance("jks");
  2. try (InputStream is = Files.newInputStream(keyStorePath)) {
  3. truststore.load(is, keyStorePass.toCharArray());
  4. }
  5. SSLContextBuilder sslBuilder = SSLContexts.custom()
  6. .loadTrustMaterial(truststore, null);
  7. final SSLContext sslContext = sslBuilder.build();
  8. RestClientBuilder builder = RestClient.builder(
  9. new HttpHost("localhost", 9200, "https"))
  10. .setHttpClientConfigCallback(new HttpClientConfigCallback() {
  11. @Override
  12. public HttpAsyncClientBuilder customizeHttpClient(
  13. HttpAsyncClientBuilder httpClientBuilder) {
  14. return httpClientBuilder.setSSLContext(sslContext);
  15. }
  16. });

 4、嗅探器(Sniffer):允许从运行的elasticsearch集群中自动发现节点,并将其设置到现有的RestClient实例中。 默认情况下,它将使用Nodes Info api来检索属于集群的节点,并使用jackson解析响应的json数据。假如集群中有100个节点,如果我们全部用手写进代码那样麻烦而且容易出错。这时候就可以使用嗅探器来自动发现节点。

  4.1、先引入jar包

  1. <dependency>
  2. <groupId>org.elasticsearch.client</groupId>
  3. <artifactId>elasticsearch-rest-client-sniffer</artifactId>
  4. <version>6.6.</version>
  5. </dependency>

  4.2、sinffer的创建和关闭

  1. RestClient restClient = RestClient.builder(
  2. new HttpHost("localhost", , "http"))
  3. .build();
  4. //创建Sniffer 并设置一分钟更新一次,默认为5分钟
  5. Sniffer sniffer = Sniffer.builder(restClient)
  6. .setSniffIntervalMillis().build();
  7.  
  8. //sniffer需要在restClient之前关闭
  9. sniffer.close();
  10. restClient.close();

  4.3、还可以启用故障嗅探功能,这意味着在每次故障之后,节点列表将立即更新,而不是在接下来的普通嗅探轮中更新。在这种情况下,需要首先创建一个SniffOnFailureListener,并在创建RestClient时提供它。同样,在稍后创建嗅探器之后,它需要与相同的SniffOnFailureListener实例相关联,该实例将在每次失败时得到通知,并使用嗅探器执行所述的额外嗅探。

  1. SniffOnFailureListener sniffOnFailureListener =
  2. new SniffOnFailureListener();
  3. RestClient restClient = RestClient.builder(
  4. new HttpHost("localhost", ))
  5. .setFailureListener(sniffOnFailureListener)
  6. .build();
  7. Sniffer sniffer = Sniffer.builder(restClient)
  8. .setSniffAfterFailureDelayMillis()
  9. .build();
  10. sniffOnFailureListener.setSniffer(sniffer);

  4.4、使用https进行连接

  1. RestClient restClient = RestClient.builder(
  2. new HttpHost("localhost", 9201, "http"))
  3. .build();
  4. NodesSniffer nodesSniffer = new ElasticsearchNodesSniffer(
  5. restClient,
  6. ElasticsearchNodesSniffer.DEFAULT_SNIFF_REQUEST_TIMEOUT,
  7. ElasticsearchNodesSniffer.Scheme.HTTPS);
  8. Sniffer sniffer = Sniffer.builder(restClient)
  9. .setNodesSniffer(nodesSniffer).build();

  4.5、同样,也可以定制sniffRequestTimeout,默认值为1秒。是超时参数作为一个查询字符串参数当调用节点信息提供api,所以当超时过期在服务器端,一个有效的响应仍返回虽然可能只包含节点的一个子集,是集群的一部分,那些在那之前已经做出了回应。

  1. RestClient restClient = RestClient.builder(
  2. new HttpHost("localhost", 9201, "http"))
  3. .build();
  4. NodesSniffer nodesSniffer = new ElasticsearchNodesSniffer(
  5. restClient,
  6. TimeUnit.SECONDS.toMillis(5),
  7. ElasticsearchNodesSniffer.Scheme.HTTP);
  8. Sniffer sniffer = Sniffer.builder(restClient)
  9. .setNodesSniffer(nodesSniffer).build();

二、Java High Level REST Client

  Java高级REST客户机在Java低级REST客户机之上工作。它的主要目标是公开API特定的方法,这些方法接受请求对象作为参数并返回响应对象,以便请求编组和响应反编组由客户机本身处理。 可以同步或异步调用每个API。同步方法返回一个响应对象,而异步方法(名称以async后缀结尾)则需要一个侦听器参数,一旦响应或错误为r,侦听器参数(在低级客户机管理的线程池上)就会被通知

  1、兼容性

    1.1、Java高级REST客户机需要Java 1.8,并且依赖于Elasticsearch core项目。客户端版本与客户端开发的Elasticsearch版本相同

    1.2、高级客户机保证能够与运行在相同主版本和更大或更小版本上的Elasticsearch节点通信。它不需要处于与之通信的Elasticsearch节点相同的次要版本中,因为它是向前兼容的,这意味着它支持与后来版本的Elasticsearch通信。

但是向前版本通信可能会有不兼容的。例如在6.1和6.0之间,如果6.1客户机支持一些api的新请求体字段,而这些api是6.0节点所不知道的。

    1.3、建议当elasticsearch集群版本升级后,最好是将客户端版本也升级到该版本。

  2、引入jar包

  1. <dependency>
  2. <groupId>org.elasticsearch.client</groupId>
  3. <artifactId>elasticsearch-rest-high-level-client</artifactId>
  4. <version>6.6.0</version>
  5. </dependency>

  3、编写代码

  1. public class HighLeveRestClientTest {
  2.  
  3. public static void main(String[] args) throws IOException {
  4. //创建高级rest客户端
  5. /*高级客户端将在内部创建用于基于提供的构建器执行请求的低级客户端。这个低级客户机维护一个连接池,并启动一些线程,
  6. * 所以当您真正完成高级客户机的操作时,应该关闭它,然后关闭内部低级客户机来释放这些资源。
  7. * */
  8. //高级rest客户端和低级客户端一样设置requestOptions,具体参考低级客户端。
  9. RestHighLevelClient restClient = new RestHighLevelClient(
  10. RestClient.builder(
  11. new HttpHost("127.0.0.1", 9201),
  12. new HttpHost("127.0.0.1", 9202),
  13. new HttpHost("127.0.0.1", 9203)
  14. )
  15. );
  16.  
  17. //构建请求,有很多种构建请求的方式,这里只列举一种
  18. IndexRequest request = new IndexRequest(
  19. "posts",
  20. "doc",
  21. "1");
  22. String jsonString = "{" +
  23. "\"user\":\"kimchy\"," +
  24. "\"postDate\":\"2013-01-30\"," +
  25. "\"message\":\"trying out Elasticsearch\"" +
  26. "}";
  27. request.source(jsonString, XContentType.JSON);
  28.  
  29. //执行请求
  30. IndexResponse indexResponse = restClient.index(request, RequestOptions.DEFAULT);
  31.  
  32. //处理返回
  33. String index = indexResponse.getIndex();
  34. String type = indexResponse.getType();
  35. String id = indexResponse.getId();
  36. long version = indexResponse.getVersion();
  37. System.out.println(index);
  38. System.out.println(type);
  39. System.out.println(id);
  40. System.out.println(version);
  41. if (indexResponse.getResult() == DocWriteResponse.Result.CREATED) {
  42. System.out.println("创建");
  43. } else if (indexResponse.getResult() == DocWriteResponse.Result.UPDATED) {
  44. System.out.println("更新");
  45. }
  46. ReplicationResponse.ShardInfo shardInfo = indexResponse.getShardInfo();
  47. if (shardInfo.getTotal() != shardInfo.getSuccessful()) {
  48.  
  49. }
  50. if (shardInfo.getFailed() > 0) {
  51. for (ReplicationResponse.ShardInfo.Failure failure :
  52. shardInfo.getFailures()) {
  53. String reason = failure.reason();
  54. System.out.println(reason);
  55. }
  56. }
  57. //关闭客户端
  58. restClient.close();
  59. }
  60.  
  61. }

由于后续的api太多,懒得记录了,上个链接吧https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high.html

ES 常用java api的更多相关文章

  1. 常用Java API之Ramdom--用代码模拟猜数小游戏

    常用Java API之Ramdom Ramdom类用来生成随机数字.使用起来也是三个步骤: 1.导包 import java.util.Random; 2.创建 Random r = new Rand ...

  2. 常用Java API之Scanner:功能与使用方法

    Scanner 常用Java API之Scanner:功能与使用方法 Scanner类的功能:可以实现键盘输入数据到程序当中. 引用类型的一般使用步骤:(Scanner是引用类型的) 1.导包 imp ...

  3. 算法竞赛中的常用JAVA API:PriorityQueue(优先队列)(转载)

    算法竞赛中的常用JAVA API:PriorityQueue(优先队列) PriorityQueue 翻译过来就是优先队列,本质是一个堆, 默认情况下堆顶每次都保留最小值,每插入一个元素,仍动态维护堆 ...

  4. 算法竞赛中的常用JAVA API :HashSet 和 TreeSet(转载)

    算法竞赛中的常用JAVA API :HashSet 和 TreeSet set set容器的特点是不包含重复元素,也就是说自动去重. HashSet HashSet基于哈希表实现,无序. add(E ...

  5. 算法竞赛中的常用JAVA API :HashMap 和 TreeMap(转载)

    算法竞赛中的常用JAVA API :HashMap 和 TreeMap 摘要 本文主要介绍Map接口下的HashMap和TreeMap. HashMap HashMap是基于哈希表的 Map 接口的实 ...

  6. 8.算法竞赛中的常用JAVA API :Calendar日期类

    8.算法竞赛中的常用JAVA API :Calendar日期类 摘要 在蓝桥杯中有关于日期计算的问题,正好java中的Date类和Calendar类提供了对日期处理的一些方法.Date类大部分方法已经 ...

  7. 7.算法竞赛中的常用JAVA API :String 、StringBuilder、StringBuffer常用方法和区别(转载)

    7.算法竞赛中的常用JAVA API :String .StringBuilder.StringBuffer常用方法和区别 摘要 本文将介绍String.StringBuilder类的常用方法. 在j ...

  8. 6.算法竞赛中的常用JAVA API :Math类(转载)

    6.算法竞赛中的常用JAVA API :Math类 求最值 最小值 Math.min(int a, int b) Math.min(float a, float b) Math.min(double ...

  9. 算法竞赛中的常用JAVA API :大数类(转载)

    5.算法竞赛中的常用JAVA API :大数类 摘要 java中的基础数据类型能存储的最大的二进制数是 2 ^ 63 - 1 对应的十进制数是9223372036854775807(long类型的最大 ...

随机推荐

  1. 浅谈Flutter(一):搭建Flutter开发环境

    学习内容来自: Flutter中文网  . Flutter实战 -------------------------------------------------------------------- ...

  2. ElasticSearch head 插件安装

    head 客户端可以很方便在上面创建索引,类型,文档,还有查询,使用它管理elasticsearch 提高效率. 在安装head 客户端之前必须安装node.js 环境,因为它是用node.js 编写 ...

  3. SQL Server 取日期时间格式 日期与字符串之间的转换

    SQL Server 取日期时间部分   在本文中,GetDate()获得的日期由两部分组成,分别是今天的日期和当时的时间: Select GetDate()  用DateName()就可以获得相应的 ...

  4. C# -- 使用 DriveInfo 获取磁盘驱动器信息

    C# -- 使用 DriveInfo 获取磁盘驱动器信息 1. 代码实现 class Program { static void Main(string[] args) { GetComputerDi ...

  5. drools规则引擎与kie-wb和kie-server远程执行规则(7.18.0.Final)

    最近研究了一下规则引擎drools. 这篇博客带你搭建并运行一个可在线编辑,在线打包,远程执行的规则引擎(drools) 本篇博客同时参考https://blog.csdn.net/chinrui/a ...

  6. linux 安装中文字体

    工具/原料   centos6.5_x64 方法/步骤    centos6.5下使用下面命令进行安装 yum install -y fontconfig mkfontscale  使用fc-list ...

  7. asp.net core 排序过滤分页组件:sieve(2)表达式树的复习

    在Sieve组件中使用了很多关于表达式树的知识,但在我们日常的工作中写表达式树的机会是非常少的,至少在我的编程生涯中没怎么写过表达式树(可能也就是3,4次).所以,为了能够看懂Sieve里面的源代码, ...

  8. 08 Django REST Framework 解决前后端分离项目中的跨域问题

    01-安装模块 pip install django-cors-headers 02-添加到INSTALL_APPS中 INSTALLED_APPS = ( ... 'corsheaders', .. ...

  9. 自己常用易忘的CSS样式

    鼠标小手:   cursor:pointer 点击边框消失:outline:none; ul li下划线以及点消失: list-style-type:none; span 超出内容为...:overf ...

  10. mysql5.6.x 字符集修改

    1 安装好mysql5.6.x 之后,修改字符集配置为utf8才能支持中文,因为默认为latin1 查看mysql字符集命令: SHOW VARIABLES LIKE 'char%' 2 修改配置文件 ...