SpringBoot整合ES

1:SpringBoot整合hign-level-client

我们接下来用java操作es
检索场景:
检索条件的时候,就要给es发送请求,检索出真正的商品,展示到界面中,这个请求应该由一段java程序来接受,并且发给es来处理,处理的结果在返回给前端界面,对于java来操作es有如下两种方式
在这里插入图片描述
在这里插入图片描述
https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high.html
es的官方文档介绍

  • Java高级REST客户端在Java低级REST客户端之上工作。它的主要目标是公开API特定的方法,这些方法接受请求对象作为参数并返回响应对象,因此请求编组和响应反编组由客户机本身处理。
  • 每个API都可以同步或异步调用。同步方法返回一个响应对象,而名称以async后缀结尾的异步方法需要一个侦听器参数,在接收到响应或错误时,该侦听器参数将被通知(在低层客户端管理的线程池中)。
  • Java高级REST客户端依赖于Elasticsearch核心项目。它接受与TransportClient相同的请求参数,并返回相同的响应对象。

SpringBoot整合hign-level-client
第一步:新建一个mall-search,并且导入elasticsearch-rest-high-level-client依赖

<dependency>
			<groupId>org.elasticsearch.client</groupId>
			<artifactId>elasticsearch-rest-high-level-client</artifactId>
			<version>7.4.2</version>
		</dependency>

虚拟机中es的版本7.4.2一定要和后端中springboot管理的es版本一致,统一用7.4.2
jar包冲突解决办法
第二步:对es进行配置,EsConfig

  • 高级客户端将在内部创建用于根据所提供的构建器执行请求的低级客户端。这个低级客户端维护一个连接池并启动一些线程,因此您应该在正确地使用高级客户端时关闭它,它将依次关闭内部低级客户端以释放这些资源。这可以通过结束:
@Configuration
public class MallESConfig {

    @Bean
    public RestHighLevelClient esRestClient(){
//        RestHighLevelClient client = new RestHighLevelClient(
//                RestClient.builder(
//                        new HttpHost("localhost", 9200, "http"),
//                        new HttpHost("localhost", 9201, "http")));

        RestClientBuilder builder = null;
        //源码知道:Returns a new {@link RestClientBuilder} to help with {@link RestClient} creation.
        // public HttpHost(String hostname, int port, String scheme) {
         builder = RestClient.builder(new HttpHost("192.168.56.10", 9200, "http"));
        RestHighLevelClient restHighLevelClient=new RestHighLevelClient(builder);
        return restHighLevelClient;
    }

}
server:
  port: 10000
spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
  application:
    name: mall-search

bootstrap.properties

spring.application.name=mall-search
spring.cloud.nacos.config.server-addr=localhost:8848
spring.cloud.nacos.config.namespace=b2178961-4989-4695-a8e3-bce7f273ed54
spring.cloud.nacos.config.ext-config[0].dataId=Nacos.yml
spring.cloud.nacos.config.ext-config[0].group=dev
spring.cloud.nacos.config.ext-config[0].refresh=true

2:整合-测试保存

我们从官网中一个了解的就是RequestOptions,比如es添加了安全访问规则,所有请求访问es都必须带上一个安全的头和设置信息,我们就可以通过RequestOptions对请求进行统一设置

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前使用代理的header。不需要设置Content-Type头,因为客户机将从附加到请求的HttpEntity自动设置它。
  • 可以设置NodeSelector,它控制哪些节点将接收请求。NodeSelector。skip_dedication _masters是一个不错的选择。
  • 还可以定制用于缓冲异步响应的响应使用者。默认使用者将在JVM堆上缓冲最多100MB的响应。如果响应较大,则请求将失败。例如,您可以降低最大大小,如果您运行在像上面示例那样的堆受限的环境中,这可能很有用。
  • 一旦你创建了单例,你就可以在请求时使用它:
request.setOptions(COMMON_OPTIONS);
  • 您还可以根据每个请求定制这些选项。例如,这增加了一个额外的标题:
RequestOptions.Builder options = COMMON_OPTIONS.toBuilder();
options.addHeader("cats", "knock things off of other things");
request.setOptions(options);

根据上面分析,在mall-search中的config中导入对应文档的代码

@Configuration
public class MallESConfig {

    //通用的设置项
    public 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();
    }
  • 同步执行:当以以下方式执行一个IndexRequest时,客户端会等待返回IndexResponse,然后继续执行代码:
IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT);
  1. 在无法解析高级REST客户机中的REST响应、请求超时或类似的情况下(服务器没有返回响应),同步调用可能会抛出IOException。
  2. 在服务器返回4xx或5xx错误代码的情况下,高级客户端尝试解析响应体错误细节,然后抛出通用的ElasticsearchException,并将原始的ResponseException作为抑制异常添加到其中。
  • 异步执行:执行IndexRequest也可以以异步方式完成,这样客户端就可以直接返回。用户需要通过将请求和侦听器传递给异步索引方法来指定如何处理响应或潜在故障:
//执行完成时要执行的IndexRequest和要使用的ActionListener
client.indexAsync(request, RequestOptions.DEFAULT, listener); 

异步方法不会阻塞并立即返回。一旦ActionListener完成,如果执行成功,则使用onResponse方法回调;如果执行失败,则使用onFailure方法回调。故障场景和预期异常与同步执行情况相同。

测试代码:我们按照如下官网测试indexAPI的使用,它提供了很多种方法,我们只使用第一种
https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high-document-index.html
一个IndexRequest需要以下参数:

//Index
IndexRequest request = new IndexRequest("posts"); 
//请求的文档id
request.id("1"); 
String jsonString = "{" +
        "\"user\":\"kimchy\"," +
        "\"postDate\":\"2013-01-30\"," +
        "\"message\":\"trying out Elasticsearch\"" +
        "}";
        //以字符串形式提供的文档源(也可以把对象转化成json传输)
request.source(jsonString, XContentType.JSON); 

测试

/**
	 * 测试存储数据到es,更新也可以
	 */
	@Test
	public void indexData() throws IOException {

		IndexRequest request = new IndexRequest("users");
		request.id("1");
		User user=new User();
		user.setName("zlj");
		user.setPassword("123");
		//转化成json对象
		String string = JSON.toJSONString(user);
		request.source(string, XContentType.JSON);
		//执行保存操作
		IndexResponse indexResponse=restHighLevelClient.index(request, MallESConfig.COMMON_OPTIONS);

		//提取有用的响应数据
		System.out.println(indexResponse);
	}

	@Data
	class User{

		private String name;
		private String password;
	}

我们先打开kibana观察是否有users的数据,结果是没有的连users都没有

GET users/_search

执行上面的代码,再打开kibana观察是否有users的数据,结果显示成功展示了数据

©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页