Springboot整合ElasticSearch(1)- 环境搭建 -非自动注入的方式

2023-09-22 15:03:13

Springboot 整合ElasticSearch(1)

1、基本信息

1、SpringBoot 版本 : 2.7.14
   <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.14</version>
        <relativePath/> 
    </parent>
    
2、ElasticSearch版本 : 7.9.1

2、添加依赖

    <properties>
        <!-- 指定jdk的版本 -->
        <java.version>1.8</java.version>
        <!-- 指定elasticsearch 的版本为 7.9.1 -->
        <elasticsearch.version>7.9.1</elasticsearch.version>
    </properties>



    <dependencies>
	    <!-- SpringBoot 核心包 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
		    <groupId>org.springframework.boot</groupId>
		    <artifactId>spring-boot-configuration-processor</artifactId>
		    <optional>true</optional>
		</dependency>

        
        <!-- elasticsearch 的启动器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>
        
    </dependencies>

3.配置elasticsearch的属性

在application.yaml中添加如下数据

es:
  clusterName: clusterTestEs # es集群的名称
  userName: userName # es集群的访问用户名
  passWord: password # es集群的访问密码
  nodes: # es集群的节点列表
    - 192.168.2.5:9200
    - 192.168.2.6:9200
    - 192.168.2.7:9200

4.构造elasticsearch的属性配置类

通过配置类的方式读取application.yaml中的属性


import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

import java.util.List;

@Configuration
@ConfigurationProperties(prefix = "es") // 指定配置的前缀
public class ElasticSearchProperties {

    private String clusterName;
    private String userName;
    private String passWord;
    private List<String> nodes;

	// 下面是正常的 无参构造、有参构造、getter方法、setter方法、toString() 方法
     。。。。。。

}

5.构造elasticsearch 客户端对象配置类

主要是创建一个RestHighLevelClient 类型的客户端对象,在实际操作过程中都要用到这个对象。
下面的这个方法,直接照抄即可,无需进行修改。

import org.apache.commons.lang3.StringUtils;
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.impl.client.BasicCredentialsProvider;
import org.elasticsearch.client.Node;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.List;
import java.util.Objects;


@Configuration
public class ElasticSearchConfig  {

    private Logger logger = LoggerFactory.getLogger(ElasticSearchConfig.class);

    private static final int ADDRESS_LENGTH = 2;
    private static final String HTTP_SCHEME = "http";

    @Autowired
    private ElasticSearchProperties esProperties;

    @Bean
    public RestClientBuilder restClientBuilder() {

        List<String> nodes = esProperties.getNodes();
        HttpHost[] httpHosts = nodes.stream()
                .map(this::makeHttpHost)
                .filter(Objects::nonNull)
                .toArray(HttpHost[]::new);
        return RestClient.builder(httpHosts);
    }

	/**
	* 下面的这个bean 是一个创建客户端的核心的 bean
	*/
    @Bean(name = "highLevelClient")
    public RestHighLevelClient highLevelClient(@Autowired RestClientBuilder restClientBuilder){
        //配置身份验证 : 就是用户名密码
        final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY,
                   new UsernamePasswordCredentials(esProperties.getUserName(), esProperties.getPassWord()));
        restClientBuilder.setHttpClientConfigCallback(
                httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider).disableAuthCaching());
        //设置连接超时和套接字超时
        restClientBuilder.setRequestConfigCallback(
                requestConfigBuilder -> requestConfigBuilder.setSocketTimeout(10000).setConnectTimeout(60000));
        
        //设置监听器,每次节点失败都可以监听到,可以作额外处理
        restClientBuilder.setFailureListener(new RestClient.FailureListener() {
            @Override
            public void onFailure(Node node) {
                super.onFailure(node);
                logger.error(node.getHost() + "--->该节点失败了");
            }
        });
        // 返回客户端对象
        return new RestHighLevelClient(restClientBuilder);
    }

	// 处理节点的方法,把配置文件的节点的IP和端口号拆分开,创建HttpHost对象
    private HttpHost makeHttpHost(String str) {
        assert StringUtils.isNotEmpty(str);
        String[] address = str.split(":");
        if (address.length == ADDRESS_LENGTH) {
            String ip = address[0];
            int port = Integer.parseInt(address[1]);
            logger.info("ES连接ip和port:{},{}", ip, port);
            return new HttpHost(ip, port, HTTP_SCHEME);
        } else {
            logger.error("传入的ip参数不正确!");
            return null;
        }
    }
}

6.创建一个工具类,封装一些工具方法

经过以上5个步骤,已经成功配置并且获取到了操作elasticsearch的客户端对象,
下面就可以使用该客户端对象进行操作了。
因此,可以使用该对象进行一些常用方法的封装,下面的代码以判断索引库是否存在为例,进行演示。


import org.elasticsearch.client.RestHighLevelClient;

import org.elasticsearch.client.indices.GetIndexRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component
public class ElasticSearchUtil {

    @Qualifier("highLevelClient")
    @Autowired
    private RestHighLevelClient rhlClient;

    private static  RestHighLevelClient client;

    /**
     * spring容器初始化的时候执行该方法
     */
    @PostConstruct
    public void init() {
        client = this.rhlClient;
        log.info("esclient 对象初始化success!{}",client);
    }


    /**
     * 判断索引是否存在
     * @param indexName
     * @throws Exception
     */
    public void judgeIndexExist(String indexName) throws Exception{
        GetIndexRequest getIndexRequest = new GetIndexRequest(indexName);
        boolean exists = client.indices().exists(getIndexRequest, RequestOptions.DEFAULT);

        System.out.println(indexName + "  exists ?  : " + exists);

    }

}

7.测试是否可以正常使用

测试思路 :
1.在spring boot中编写一个简单的接口,接口中节点调用一下 步骤6中的方法。
2.访问接口看是否能够正常获取到状态即可。


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
@RequestMapping("/test")
public class EsController  {

    @Autowired
    private ElasticSearchUtil elasticSearchUtil;


    @PostMapping("/judgeIndexState")
    public String createIndex(@RequestBody String indexName){

        logger.info("参数索引名称是 : "+indexName);
        try {
        	// 直接调用工具方法中的参数即可
            elasticSearchUtil.judgeIndexExist(indexName);
            
        }catch (Exception e){
            e.printStackTrace();
        }

        return "-"+indexName;
    }
}

8.完成

在步骤7中访问成功后,即表示当前的集成工作完成。

更多推荐

[JAVAee]Spring使用注解来存储与获取Bean对象

前置内容:[JAVAee]Spring项目的创建与基本使用_HY_PIGIE的博客-CSDN博客先前我们在项目中注册类到spring中,要在xml中一行一行的手动添加bean标签.如果对象数目一多起来,就会显得非常繁琐.本文章介绍了使用另一种方法,使用注解的方式快捷的完成Bean对象的存储与获取.配置spring.xm

基于PHP语言研发的抖音矩阵系统源代码开发部署技术文档分享

一、概述本技术文档旨在介绍抖音SEO矩阵系统源代码的开发部署流程,以便开发者能够高效地开发、测试和部署基于PHP语言的开源系统。通过本文档的指引,您将能够掌握抖音SEO矩阵系统的开发环境和部署方案,从而快速地构建出稳定、可靠的短视频SEO优化系统。二、开发环境搭建PHP环境安装:在系统上安装PHP解释器,推荐使用PHP

协议的定义

协议是网络通信实体之间在数据交换过程中需要遵循的规则或约定,是计算机网络有序运行的重要保证。任何一个协议都会显式或隐式地定义3个基本要素:语法、语义和时序,称为协议三要素。语法:语法定义实体之间交换信息的格式与结构,或者定义实体(比如硬件设备)之间传输信号的电平等。语义:定义实体之间交换的信息中需要发送(或包含)哪些控

企业架构LNMP学习笔记59

目录介绍:bin:存放的是启动和关闭tomcat的脚本文件;conf:存放tomcat服务器的各种全局配置文件,其中最重要的是server.xml和web.xmllib:存放的是tomcat服务器所需要的各种jar文件。java打包类库。logs:存放tomcat执行时的日志文件temp:是tomcat存放的临时文件w

Linux知识点 -- HTTPS协议

Linux知识点–HTTPS协议文章目录Linux知识点--HTTPS协议一、概念1.HTTPS协议2.加密3.运营商劫持4.常见的加密方式4.数据摘要&&数字指纹5.数字签名二、HTTPS的工作过程探究1.方案一:只用对称加密2.方案二:只使用非对称加密3.方案三:双方都使用非对称加密4.方案四:非对称加密+对称加密

接口隔离原则~

接口隔离原则是面向对象设计原则中的一条原则,它的核心思想是将大接口拆分为多个小接口,客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上,接口应该具有单一功能,不应该包含不相关或不需要的方法,以便提高系统的灵活性和可维护性。它同时也要求接口的设计应该稳定,一旦设计好后,就不应该频繁地进行修改。

构建可维护的大规模应用:框架架构的最佳实践

文章目录框架架构的重要性最佳实践1.模块化设计2.遵循SOLID原则3.使用设计模式4.异常处理5.代码注释和文档6.测试SpringBoot和Django:关键框架示例SpringBoot(Java)模块化设计:SOLID原则:设计模式:依赖注入和工厂模式:异常处理:代码注释和文档:测试:Django(Python)

【无公网IP】Windows搭建 WebDAV服务,并内网穿透公网访问

文章目录1.安装IIS必要WebDav组件2.客户端测试3.cpolar内网穿透3.1打开Web-UI管理界面3.2创建隧道3.3查看在线隧道列表3.4浏览器访问测试4.安装Raidrive客户端4.1连接WebDav服务器4.2连接成功4.2连接成功总结自己用WindowsServer搭建了家用NAS主机,WebDA

C- 使用exit()的优点

使用exit函数有很多优点,特别是在大型程序和系统中。我们来逐一分析这些优点:可以从其他函数中调用:在C语言和许多其他编程语言中,exit是一个库函数,通常在stdlib.h(C)或cstdlib(C++)头文件中定义。这个函数的主要功能是终止程序的执行并返回一个状态码到调用进程(通常是操作系统或shell)。由于ex

用Win10自带画图3D抠图

文章目录一、打开“画图3D”二、插入图片三、抠图操作四、保存抠图一、打开“画图3D”在搜索框输入“画图3D”选择彩色水滴图标的软件二、插入图片选择“新建”导航栏“菜单”–>“插入”,选择要扣的图片。(我选择了一张自己随意画的图片)三、抠图操作选择导航栏的“神奇选择”选择“下一步”因为我的图片非常规整,所以自动选中了圆形

SpringAOP

AOP实现原理SpringAOP基于动态代理实现原理:○如果被代理的对象,已经实现某个接口,则SpringAOP会使用JDKProxy(反射),基于接口的方式,创建代理对象(JDK动态代理的核心是InvocationHandler接口和Proxy类);○如果被代理的对象,没有实现某个接口,就无法使用JDKProxy去进

热文推荐