Elasticsearch 入门实战(4)–Java Low Level REST Client 使用

本文主要介绍 Elasticsearch Java Low Level REST Client 的使用,相关的环境及软件信息如下:CentOS 7.6.1810、Java 1.8.0_321(客户端用)、Elasticsearch 8.2.2。

1、Java Low Level REST Client 的特点

  • minimal dependencies
  • load balancing across all available nodes
  • failover in case of node failures and upon specific response codes
  • failed connection penalization (whether a failed node is retried depends on how many consecutive times it failed; the more failed attempts the longer the client will wait before trying that same node again)
  • persistent connections
  • trace logging of requests and responses
  • optional automatic discovery of cluster nodes

2、引入依赖

<dependency>
    <groupId>org.elasticsearch.clientgroupId>
    <artifactId>elasticsearch-rest-clientartifactId>
    <version>8.2.2version>
dependency>

3、使用

Java Low Level REST Client 主要工作是组装 JSON 格式的请求数据,其他都是些通用的配置;请求数据的详细说明可参考:Elasticsearch 入门实战(3)–REST API 使用

3.1、Elasticsearch 关闭了安全认证,使用 HTTP 协议访问

@Test
public void http() {
    RestClient restClient = null;
    try {
        RestClientBuilder builder = RestClient.builder(
                new HttpHost("10.49.196.10", 9200),
                new HttpHost("10.49.196.11", 9200),
                new HttpHost("10.49.196.12", 9200));
        //设置失败监听器
        builder.setFailureListener(new RestClient.FailureListener() {
            @Override
            public void onFailure(Node node) {
                logger.info("失败:node={}", node);
            }
        });
        //设置请求头
        Header[] defaultHeaders = new Header[]{new BasicHeader("head-a", "123")};
        builder.setDefaultHeaders(defaultHeaders);

        //设置节点选择器
        builder.setNodeSelector(NodeSelector.SKIP_DEDICATED_MASTERS);

        //设置请求配置回调方法
        builder.setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback() {
            @Override
            public RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder builder) {
                return builder.setSocketTimeout(1000 * 5);
            }
        });

        //用户名密码
        CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("elastic", "123456"));
        //设置HttpClient配置回调方法
        builder.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
            @Override
            public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpAsyncClientBuilder) {
                return httpAsyncClientBuilder.setUserAgent("elasticseatch-rest-client").setDefaultCredentialsProvider(credentialsProvider);
            }
        });
        restClient = builder.build();

        //请求对象
        Request request = new Request("GET", "/poet-index/_search");
        request.addParameter("pretty", "true");
        //请求体,json数据
        String body = "{\n" +
                "  \"query\": {\n" +
                "    \"match\": {\n" +
                "      \"success\": \"思想\"\n" +
                "    }\n" +
                "  },\n" +
                "  \"from\": 0,\n" +
                "  \"size\": 10\n" +
                "}";
        request.setEntity(new NStringEntity(body, ContentType.APPLICATION_JSON));
        Response response = restClient.performRequest(request);
        logger.info("requestLine={}", response.getRequestLine());
        logger.info("host={}", response.getHost());
        logger.info("statusCode={}", response.getStatusLine().getStatusCode());
        logger.info("headers={}", response.getHeaders());
        logger.info("responseBody={}", EntityUtils.toString(response.getEntity()));
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (restClient != null) {
            try {
                restClient.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

3.2、Elasticsearch 开启了安全认证,使用 HTTPS 协议访问

@Test
public void https() {
    RestClient restClient = null;
    try {
        RestClientBuilder builder = RestClient.builder(
                new HttpHost("10.49.196.10", 9200, "https"),
                new HttpHost("10.49.196.11", 9200, "https"),
                new HttpHost("10.49.196.12", 9200, "https"));
        //设置失败监听器
        builder.setFailureListener(new RestClient.FailureListener() {
            @Override
            public void onFailure(Node node) {
                logger.info("失败:node={}", node);
            }
        });
        //设置请求头
        Header[] defaultHeaders = new Header[]{new BasicHeader("head-a", "123")};
        builder.setDefaultHeaders(defaultHeaders);

        //设置节点选择器
        builder.setNodeSelector(NodeSelector.SKIP_DEDICATED_MASTERS);

        //设置请求配置回调方法
        builder.setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback() {
            @Override
            public RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder builder) {
                return builder.setSocketTimeout(1000 * 5);
            }
        });

        //用户名密码
        CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("elastic", "123456"));
        //设置HttpClient配置回调方法
        builder.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
            @Override
            public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpAsyncClientBuilder) {
                return httpAsyncClientBuilder.setUserAgent("elasticseatch-rest-client")
                        .setDefaultCredentialsProvider(credentialsProvider)
                        .setSSLContext(getSSLContext());
            }
        });
        restClient = builder.build();

        //请求对象
        Request request = new Request("GET", "/poet-index/_search");
        request.addParameter("pretty", "true");
        //请求体,json数据
        String body = "{\n" +
                "  \"query\": {\n" +
                "    \"match\": {\n" +
                "      \"success\": \"思想\"\n" +
                "    }\n" +
                "  },\n" +
                "  \"from\": 0,\n" +
                "  \"size\": 10\n" +
                "}";
        request.setEntity(new NStringEntity(body, ContentType.APPLICATION_JSON));
        Response response = restClient.performRequest(request);
        logger.info("requestLine={}", response.getRequestLine());
        logger.info("host={}", response.getHost());
        logger.info("statusCode={}", response.getStatusLine().getStatusCode());
        logger.info("headers={}", response.getHeaders());
        logger.info("responseBody={}", EntityUtils.toString(response.getEntity()));
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (restClient != null) {
            try {
                restClient.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

3.3、完整代码

Elasticsearch 入门实战(4)--Java Low Level REST Client 使用
package com.abc.demo.es;

import org.apache.http.Header;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.conn.ssl.TrustAllStrategy;
import org.apache.http.entity.ContentType;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.apache.http.message.BasicHeader;
import org.apache.http.nio.entity.NStringEntity;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.ssl.SSLContexts;
import org.apache.http.util.EntityUtils;
import org.elasticsearch.client.*;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.net.ssl.SSLContext;
import java.io.IOException;

public class ElasticseatchRestClientCase {
    private static final Logger logger = LoggerFactory.getLogger(ElasticseatchRestClientCase.class.getName());

    @Test
    public void http() {
        RestClient restClient = null;
        try {
            RestClientBuilder builder = RestClient.builder(
                    new HttpHost("10.49.196.10", 9200),
                    new HttpHost("10.49.196.11", 9200),
                    new HttpHost("10.49.196.12", 9200));
            //设置失败监听器
            builder.setFailureListener(new RestClient.FailureListener() {
                @Override
                public void onFailure(Node node) {
                    logger.info("失败:node={}", node);
                }
            });
            //设置请求头
            Header[] defaultHeaders = new Header[]{new BasicHeader("head-a", "123")};
            builder.setDefaultHeaders(defaultHeaders);

            //设置节点选择器
            builder.setNodeSelector(NodeSelector.SKIP_DEDICATED_MASTERS);

            //设置请求配置回调方法
            builder.setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback() {
                @Override
                public RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder builder) {
                    return builder.setSocketTimeout(1000 * 5);
                }
            });

            //用户名密码
            CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
            credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("elastic", "123456"));
            //设置HttpClient配置回调方法
            builder.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
                @Override
                public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpAsyncClientBuilder) {
                    return httpAsyncClientBuilder.setUserAgent("elasticseatch-rest-client").setDefaultCredentialsProvider(credentialsProvider);
                }
            });
            restClient = builder.build();

            //请求对象
            Request request = new Request("GET", "/poet-index/_search");
            request.addParameter("pretty", "true");
            //请求体,json数据
            String body = "{\n" +
                    "  \"query\": {\n" +
                    "    \"match\": {\n" +
                    "      \"success\": \"思想\"\n" +
                    "    }\n" +
                    "  },\n" +
                    "  \"from\": 0,\n" +
                    "  \"size\": 10\n" +
                    "}";
            request.setEntity(new NStringEntity(body, ContentType.APPLICATION_JSON));
            Response response = restClient.performRequest(request);
            logger.info("requestLine={}", response.getRequestLine());
            logger.info("host={}", response.getHost());
            logger.info("statusCode={}", response.getStatusLine().getStatusCode());
            logger.info("headers={}", response.getHeaders());
            logger.info("responseBody={}", EntityUtils.toString(response.getEntity()));
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (restClient != null) {
                try {
                    restClient.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    @Test
    public void https() {
        RestClient restClient = null;
        try {
            RestClientBuilder builder = RestClient.builder(
                    new HttpHost("10.49.196.10", 9200, "https"),
                    new HttpHost("10.49.196.11", 9200, "https"),
                    new HttpHost("10.49.196.12", 9200, "https"));
            //设置失败监听器
            builder.setFailureListener(new RestClient.FailureListener() {
                @Override
                public void onFailure(Node node) {
                    logger.info("失败:node={}", node);
                }
            });
            //设置请求头
            Header[] defaultHeaders = new Header[]{new BasicHeader("head-a", "123")};
            builder.setDefaultHeaders(defaultHeaders);

            //设置节点选择器
            builder.setNodeSelector(NodeSelector.SKIP_DEDICATED_MASTERS);

            //设置请求配置回调方法
            builder.setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback() {
                @Override
                public RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder builder) {
                    return builder.setSocketTimeout(1000 * 5);
                }
            });

            //用户名密码
            CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
            credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("elastic", "123456"));
            //设置HttpClient配置回调方法
            builder.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
                @Override
                public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpAsyncClientBuilder) {
                    return httpAsyncClientBuilder.setUserAgent("elasticseatch-rest-client")
                            .setDefaultCredentialsProvider(credentialsProvider)
                            .setSSLContext(getSSLContext());
                }
            });
            restClient = builder.build();

            //请求对象
            Request request = new Request("GET", "/poet-index/_search");
            request.addParameter("pretty", "true");
            //请求体,json数据
            String body = "{\n" +
                    "  \"query\": {\n" +
                    "    \"match\": {\n" +
                    "      \"success\": \"思想\"\n" +
                    "    }\n" +
                    "  },\n" +
                    "  \"from\": 0,\n" +
                    "  \"size\": 10\n" +
                    "}";
            request.setEntity(new NStringEntity(body, ContentType.APPLICATION_JSON));
            Response response = restClient.performRequest(request);
            logger.info("requestLine={}", response.getRequestLine());
            logger.info("host={}", response.getHost());
            logger.info("statusCode={}", response.getStatusLine().getStatusCode());
            logger.info("headers={}", response.getHeaders());
            logger.info("responseBody={}", EntityUtils.toString(response.getEntity()));
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (restClient != null) {
                try {
                    restClient.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    private SSLContext getSSLContext() {
        try {
            SSLContextBuilder bulider = SSLContexts.custom();
            bulider.loadTrustMaterial(new TrustAllStrategy());
            return bulider.build();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

}

ElasticseatchRestClientCase.java

详细的 Elasticsearch Java Low Level REST Client 使用说明,看参考官网文档:https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/current/java-rest-low.html。

Original: https://www.cnblogs.com/wuyongyin/p/16395987.html
Author: 且行且码
Title: Elasticsearch 入门实战(4)–Java Low Level REST Client 使用

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/620087/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 消息推送接口设计(内含源码)

    我是3y,一年 CRUD经验用十年的 markdown程序员👨🏻‍💻常年被誉为优质八股文选手 今天要做的就是实现 austin-api和 austin-api-impl模块的部分代…

    Java 2023年6月9日
    099
  • MySQL十九:分库分表实践

    转载~ 在很多小型应用中都没真正使用分库分表,但是说起来并不陌生,因为我们在面试中经常会被问到,今天我们从从以下几个方面来聊聊分库分表: 「是什么?解决什么?怎么做?为什么要这么做…

    Java 2023年6月8日
    069
  • 求解马走棋问题C/C++

    在 m 行 n 列的棋盘上有一个中国象棋中的马,马走日字且只能向右走。 请找到可行路径的条数,使得马从棋盘的左下角 (1,1)(1 ,1 ) 走到右上角 (m,n)(m ,n )。…

    Java 2023年6月5日
    0119
  • SpringBoot 增删改查+文件上传

    注:本文所用到的版本 MySql 8.0.28 SpringBoot 2.7.2 准备工作 :建表 、pom.xml导入依赖 、application.yml 配置 建表 CREA…

    Java 2023年6月8日
    073
  • 解决 RabbitMQ 集群 Channel shutdown: connection error 错误(HAProxy 负载均衡)

    相关文章:搭建 RabbitMQ Server 高可用集群 具体错误信息: 2018-05-04 11:21:48.116 ERROR 60848 — [.168.0.202:…

    Java 2023年5月30日
    065
  • 《Thinking In Java》作者:不要使用并发!

    前言 今天纯粹就是带你们来读读书的~最近除了工作,特地买回了自己很喜欢的作者新发售的一本书《On Java》,作者是我的老朋友布鲁斯·埃克尔,在Java领域很有名,你可能没听过他的…

    Java 2023年6月9日
    063
  • 设计模式—桥接模式

    类型:结构型 目的:通过抽离出多个维度相互组合(聚合)来代替继承,简化系统。 话不多说,看个优化案例。 优化案例 现有系统中,对于画面窗口的边框有一套样式来控制是否有圆角。因为新的…

    Java 2023年6月7日
    053
  • JNI中C调用Java方法

    背景需求 我们需要在JNI的C代码调用Java代码。实现原理:使用JNI提供的反射借口来反射得到Java方法,进行调用。 JNI关键方法讲解。 在同一个类中,调用其他方法 JNIE…

    Java 2023年5月29日
    053
  • Java使用OpenSSL生成的RSA公私钥进行数据加解密

    参考:RSAEncrypt: package com.zhx.base.interceptor; import java.io.BufferedReader; import jav…

    Java 2023年5月29日
    052
  • 计算机网络学习—物理层

    二、 物理层 2.1 物理层的基本概念 物理层所要解决的问题(⭐) 物理层考虑的是怎样才能 在连接各种计算机的传输媒体上传输数据比特流。 物理层 为数据链路层屏蔽了各种传输媒体的差…

    Java 2023年6月7日
    060
  • VS Code安装

    如果下载速度很慢,点击官网logo下方有一行”Version xxx is now available! xxx”的蓝字进入更新说明。日期(版本)的大字下有…

    Java 2023年6月7日
    082
  • Spring Bean 标签解析

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月8日
    060
  • 线程同步的情景之二

    情景二:数量有限,先到先得 情景简介:与情景一类似,但是这次茅坑的数量不只一个。如果有需求的人数少于茅坑数量,那一切都很和谐。但是人数超过茅坑数量的时候该怎么办?多个人占用一个坑?…

    Java 2023年5月30日
    085
  • 微服务网关Gateway实践总结

    有多少请求,被网关截胡; 一、Gateway简介 微服务架构中,网关服务通常提供动态路由,以及流量控制与请求识别等核心能力,在之前的篇幅中有说过Zuul组件的使用流程,但是当下Ga…

    Java 2023年6月15日
    071
  • 并发编程之:Lock

    大家好,我是小黑,一个在互联网苟且偷生的农民工。 在之前的文章中,为了保证在并发情况下多线程共享数据的线程安全,我们会使用synchronized关键字来修饰方法或者代码块,以及在…

    Java 2023年6月7日
    076
  • JVM垃圾回收机制

    一、如何判断对象可以可以被回收 1.1 引用计数法 定义:只要一个对象被变量所引用,则该对象计数就+1,若被引用了两次,则它的引用计数就变为2,如果某一个变量不再引用它了,则它的引…

    Java 2023年6月8日
    077
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球