springboot集成elasticsearch(7.17.22)

官方文档地址:Javadoc | Elasticsearch Java API Client [7.17] | Elastic

springboot版本2.1.3

1.pom文件

以下是如何使用maven作为依赖关系管理器配置依赖关系。将以下内容添加到pom.xml文件中:

注:版本号一定要和elasticsearch的版本号保持一致!

java 复制代码
<dependency>
			<groupId>org.elasticsearch.client</groupId>
			<artifactId>elasticsearch-rest-high-level-client</artifactId>
			<version>7.17.22</version>
		</dependency>

		<dependency>
			<groupId>co.elastic.clients</groupId>
			<artifactId>elasticsearch-java</artifactId>
			<version>7.17.22</version>
		</dependency>

		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>2.17.0</version>
		</dependency>
		<dependency>
			<groupId>jakarta.json</groupId>
			<artifactId>jakarta.json-api</artifactId>
			<version>2.0.1</version>
		</dependency>
复制代码
以下是如何使用gradle作为依赖关系管理器来配置依赖关系。将以下内容添加到build.gradle文件中:
java 复制代码
dependencies {
    compile 'org.elasticsearch.client:elasticsearch-rest-client:7.17.23'
}

2.测试代码

java 复制代码
    public static void main(String[] args) throws IOException {
        final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY,
                new UsernamePasswordCredentials("你的用户名", "你的密码"));
        RestClient restClient = RestClient.builder(
                new HttpHost("127.0.0.1", 9200, "http"))
                .setHttpClientConfigCallback(
                        httpAsyncClientBuilder -> {
                            httpAsyncClientBuilder.disableAuthCaching();
                            return httpAsyncClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
                        })
                .build();

        /*
        //设置需要与每个请求一起发送的默认标头,以防止必须在每个单独的请求中指定它们
        RestClientBuilder builder = RestClient.builder(
                new HttpHost("localhost", 9200, "http"));
        Header[] defaultHeaders = new Header[]{new BasicHeader("header", "value")};
        builder.setDefaultHeaders(defaultHeaders);*/

        Request request = new Request(
                "GET",
                "/你的索引/_doc/索引id");
//        request.addParameter("pretty", "true"); //可以以name,value的方式添加多个参数,实际是在路径后边拼接的
        //也可以添加json参数
//        request.setEntity(new NStringEntity(
//                "{\"json\":\"text\"}",
//                ContentType.APPLICATION_JSON));

//        request.setOptions(COMMON_OPTIONS);


        //performRequest 是同步的,当请求成功时将阻塞调用线程并返回Response,如果失败则抛出异常。
        Response response = restClient.performRequest(request);

        RequestLine requestLine = response.getRequestLine();
        HttpHost host = response.getHost();
        int statusCode = response.getStatusLine().getStatusCode();
        Header[] headers = response.getHeaders();
        if(statusCode == 200){
            String responseBody = EntityUtils.toString(response.getEntity());
            System.out.println(responseBody);
        }else{
            System.out.println("请求失败");
        }
        /*
        //performRequestAsync是异步的,它接受一个ResponseListener参数,当请求成功时,它会用Response调用该参数,如果请求失败,则用Exception调用该参数。
        restClient.performRequestAsync(request,
                new ResponseListener() {
                    @Override
                    public void onSuccess(Response response) {
                        //Handle the response
                    }
                    @Override
                    public void onFailure(Exception exception) {
                        //Handle the failure
                    }
                });
                */
        restClient.close();
    }

3.分析

①:初始化

RestClient实例可以通过相应的RestClientBuilder类构建,该类是通过RestClient#builder(HttpHost...)静态方法创建的。唯一需要的参数是客户端将与之通信的一个或多个主机,作为HttpHost的实例提供,如下所示:

java 复制代码
RestClient restClient = RestClient.builder(
    new HttpHost("localhost", 9200, "http"),
    new HttpHost("localhost", 9201, "http")).build();

RestClient类是线程安全的,理想情况下与使用它的应用程序具有相同的生命周期。重要的是,当不再需要时,它会被关闭,这样它使用的所有资源以及底层http客户端实例及其线程都会被正确释放:

java 复制代码
restClient.close();

RestClientBuilder还允许在构建RestClient实例时可选地设置以下配置参数:

java 复制代码
RestClientBuilder builder = RestClient.builder(
    new HttpHost("localhost", 9200, "http"));
Header[] defaultHeaders = new Header[]{new BasicHeader("header", "value")};
builder.setDefaultHeaders(defaultHeaders); 

可以设置在每个单独的请求中都是用默认的请求头


java 复制代码
RestClientBuilder builder = RestClient.builder(
        new HttpHost("localhost", 9200, "http"));
builder.setFailureListener(new RestClient.FailureListener() {
    @Override
    public void onFailure(Node node) {
        //处理失败逻辑
    }
});

设置一个监听器,每次节点发生故障时都会收到通知,以防需要采取行动。启用故障嗅探时在内部使用。


java 复制代码
RestClientBuilder builder = RestClient.builder(
    new HttpHost("localhost", 9200, "http"));
builder.setNodeSelector(NodeSelector.SKIP_DEDICATED_MASTERS); 

设置用于筛选客户端将向其发送请求的节点的节点选择器,这些节点设置为客户端本身。例如,这有助于防止在启用嗅探时向专用主节点发送请求。默认情况下,客户端向每个配置的节点发送请求。


java 复制代码
RestClientBuilder builder = RestClient.builder(
        new HttpHost("localhost", 9200, "http"));
builder.setRequestConfigCallback(
    new RestClientBuilder.RequestConfigCallback() {
        @Override
        public RequestConfig.Builder customizeRequestConfig(
                RequestConfig.Builder requestConfigBuilder) {
            return requestConfigBuilder.setSocketTimeout(10000); 
        }
    });

设置一个允许修改默认请求配置的回调(例如请求超时、身份验证或org.apache.http.client.config.RequestConfig.Builder允许设置的任何内容)


java 复制代码
RestClientBuilder builder = RestClient.builder(
    new HttpHost("localhost", 9200, "http"));
builder.setHttpClientConfigCallback(new HttpClientConfigCallback() {
        @Override
        public HttpAsyncClientBuilder customizeHttpClient(
                HttpAsyncClientBuilder httpClientBuilder) {
            return httpClientBuilder.setProxy(
                new HttpHost("proxy", 9000, "http"));  
        }
    });

设置一个允许修改http客户端配置的回调(例如,通过ssl的加密通信,或org.apache.http.impl.nio.client.HttpAsyncClientBuilder允许设置的任何内容)


②执行请求

创建RestClient后,可以通过调用performRequest或performRequestAsync来发送请求。performRequest是同步的,当请求成功时将阻塞调用线程并返回Response,如果失败则抛出异常。performRequestAsync是异步的,它接受一个ResponseListener参数,当请求成功时,它会用Response调用该参数,如果请求失败,则用Exception调用该参数。

java 复制代码
Request request = new Request(
    "GET",  //请求方法GET, POST, HEAD等
    "/");   //uri
//同步
Response response = restClient.performRequest(request);

java 复制代码
Request request = new Request(
    "GET",  
    "/");   
Cancellable cancellable = restClient.performRequestAsync(request,
    new ResponseListener() {
        @Override
        public void onSuccess(Response response) {
            //成功处理
        }

        @Override
        public void onFailure(Exception exception) {
            //失败处理
        }
});

RequestOptions:

RequestOptions类包含应在同一应用程序中的多个请求之间共享的请求部分。您可以创建一个单例实例并在所有请求之间共享它:

java 复制代码
private static final RequestOptions COMMON_OPTIONS;
static {
    RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
    builder.addHeader("Authorization", "Bearer " + "你的token"); 
    builder.setHttpAsyncResponseConsumerFactory(           
        new HttpAsyncResponseConsumerFactory
            .HeapBufferedResponseConsumerFactory(30 * 1024 * 1024 * 1024));
    COMMON_OPTIONS = builder.build();
}

addHeader用于授权或在Elasticsearch前使用代理所需的标头。不需要设置Content-Type标头,因为客户端将从附加到请求的HttpEntity自动设置它。

您可以设置NodeSelector,它控制哪些节点将接收请求。节点选择器。SKIP_DEDICATED_MASTERS是一个不错的选择。

您还可以自定义用于缓冲异步响应的响应消费者。默认消费者将在JVM堆上缓冲高达100MB的响应。如果响应较大,则请求将失败。例如,您可以降低最大大小,如果您在如上例所示的堆约束环境中运行,这可能会很有用。

一旦你创建了单例,你就可以在发出请求时使用它:

java 复制代码
request.setOptions(COMMON_OPTIONS);

③返回结果

Response对象由同步performRequest方法返回,或作为ResponseListener#onSuccess(Response)中的参数接收,它封装了http客户端返回的响应对象,并公开了一些其他信息。

java 复制代码
Response response = restClient.performRequest(new Request("GET", "/"));
RequestLine requestLine = response.getRequestLine(); //已执行请求的信息
HttpHost host = response.getHost();  //响应主机的ip
int statusCode = response.getStatusLine().getStatusCode();  //响应code 200成功
Header[] headers = response.getHeaders();  //响应头
String responseBody = EntityUtils.toString(response.getEntity());  //返回结果

执行请求时,会抛出异常

I.IO异常

通信问题(例如SocketTimeout异常)

II.响应异常

返回了一个响应,但其状态代码指示错误(不是2xx)。ResponseException源自有效的http响应,因此它暴露了相应的response对象,该对象可以访问返回的响应。

对于返回404状态代码的HEAD请求,不会抛出ResponseException,因为这是一个预期的HEAD响应,只是表示找不到资源。除非ignore参数包含404,否则所有其他HTTP方法(例如GET)都会对404响应抛出ResponseException。ignore是一个特殊的客户端参数,它不会被发送到Elasticsearch,并且包含一个逗号分隔的错误状态代码列表。它允许控制某些错误状态代码是否应被视为预期响应而不是异常。例如,对于get-api来说,这很有用,因为当文档丢失时,它可以返回404,在这种情况下,响应体将不包含错误,而是通常的get-api响应,只是没有找到文档。

相关推荐
陌殇殇10 分钟前
002 SpringCloudAlibaba整合 - Feign远程调用、Loadbalancer负载均衡
java·spring cloud·微服务
猎人everest1 小时前
SpringBoot应用开发入门
java·spring boot·后端
山猪打不过家猪3 小时前
ASP.NET Core Clean Architecture
java·数据库·asp.net
AllowM3 小时前
【LeetCode Hot100】除自身以外数组的乘积|左右乘积列表,Java实现!图解+代码,小白也能秒懂!
java·算法·leetcode
不会Hello World的小苗4 小时前
Java——列表(List)
java·python·list
二十七剑5 小时前
jvm中各个参数的理解
java·jvm
东阳马生架构6 小时前
JUC并发—9.并发安全集合四
java·juc并发·并发安全的集合
Elastic 中国社区官方博客6 小时前
Elasticsearch Open Inference API 增加了对 Jina AI 嵌入和 Rerank 模型的支持
大数据·人工智能·elasticsearch·搜索引擎·ai·全文检索·jina
计算机小白一个6 小时前
蓝桥杯 Java B 组之岛屿数量、二叉树路径和(区分DFS与回溯)
java·数据结构·算法·蓝桥杯
隔壁老王1566 小时前
mysql实时同步到es
数据库·mysql·elasticsearch