• ElasticSearch7.x 升级后SpringBoot连不上?


    前言

    原来项目中使用的ElasticSearch版本6.8升级到了7.5.1,且开启了x-pack安全认证,导致原来的查询接口全部使用不了。

    注:原SprintBoot版本为2.1.x。
    连接ElasticSearch使用的是spring-boot-starter-data-elasticsearch

    本文主要讲述使用ElasticSearch6.x 升级到 ElasticSearch7.x后所需要的修改以及案例代码。

    配置修改

    SpringBoot版本升级

    在SpringBoot2.2.x版本才支持ElasticSearch7.x,所以我们先需要升级SpringBoot版本。

    <parent>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-parent</artifactId>
    	<version>2.2.2.RELEASE</version>
    	<relativePath/> <!-- lookup parent from repository -->
    </parent>
    

    ES连接配置修改

    原来spring-boot-starter-data-elasticsearch连接ES的配置如下:

    spring.data.elasticsearch.cluster-nodes = 172.31.0.207:9300
    spring.data.elasticsearch.cluster-name = elk-cluster
    spring.data.elasticsearch.repositories.enabled = true
    

    升级后主要使用rest接口进行连接,由于开启了x-pack认证,所以需要修改es的账号密码,修改后配置如下:

    spring.elasticsearch.rest.uris = 172.31.0.207:9300
    spring.elasticsearch.rest.username = elastic
    spring.elasticsearch.rest.password = changeme
    

    ElasticsearchTemplate升级

    原来spring-boot-starter-data-elasticsearch连接ES主要使用ElasticsearchTemplate进行操作,新版本主要使用ElasticsearchRestTemplate

    @Autowired
    private ElasticsearchRestTemplate elasticsearchRestTemplate;
    

    案例源码

    • pom文件
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.2.2.RELEASE</version>
        </parent>
        <groupId>com.jianzh5</groupId>
        <artifactId>esalarm</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>esalarm</name>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
            
            <!--ES-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
            </dependency>
    
    </project>
    
    • 建立ElasticSearch实体类LogDoc
    @Data
    @Document(indexName = "alarm-*",type = "_doc")
    public class LogDoc implements Serializable {
        private static final long serialVersionUID = 6320548148250372657L;
        @Id
        private String id;
        private String logLevel;
        private String module;
        private String system;
        private String refCode;
        private String response;
        private String parm;
        private String message;
        private long logTime;
    }
    
    • 建立LogRepository,操作底层查询
    @Repository
    public interface LogRepository extends ElasticsearchRepository<LogDoc,String> {
    
    }
    
    • 建立接口层LogService
    public interface LogService {
        /**
         * 根据ID获取对应的实体
         * @param id 日志id
         * @return
         */
        LogDoc getById(String id);
    
    
        /**
         * 根据时间范围查找指定格式的日志
         * @author javadaily
         * @date 2019/9/21 9:24
         * @param minRange 开始时间
         * @param maxRange 结束时间
         * @param logLevel 日志级别
         * @return 日志列表
         */
        List<LogDoc> findRangeLogByLevel(DateTime minRange,DateTime maxRange,String logLevel);
    }
    
    • 建立接口实现层LogServiceImpl
    /**
     * @author javadaily
     * @date 2019/9/10 15:12
     */
    @Service
    public class LogServiceImpl implements LogService {
        @Autowired
        private LogRepository logRepository;
    
        @Autowired
        private ElasticsearchRestTemplate elasticsearchRestTemplate;
    
        @Override
        public LogDoc getById(String id) {
            Optional<LogDoc> logOptional = logRepository.findById(id);
            return logOptional.orElse(null);
        }
    
        @Override
        public List<LogDoc> findRangeLogByLevel(DateTime minRange, DateTime maxRange, String logLevel) {
            //需要强制转换成小写
            logLevel = logLevel.toLowerCase();
            SearchQuery searchQuery = new NativeSearchQueryBuilder()
                    .withQuery(boolQuery()
                            //module,system 必须有值才能告警
                            .must(existsQuery("module"))
                            .must(existsQuery("system"))
                            .must(termQuery("logLevel", logLevel))
                            .must(rangeQuery("logTime")
                                    .from(minRange.getMillis())
                                    .to(maxRange.getMillis())))
                    .build();
    
            return elasticsearchRestTemplate.queryForList(searchQuery, LogDoc.class);
        }
    }
    

    使用ElasticsearchRepositoryElasticsearchRestTemplate对ES进行操作,ElasticsearchRestTemplate的功能比较强大,能支持更为复杂的查询,大家可以根据具体情况选择。

    好了,各位朋友们,本期的内容到此就全部结束啦,能看到这里的同学都是优秀的同学,下一个升职加薪的就是你了!
    如果觉得这篇文章对你有所帮助的话请扫描下面二维码加个关注,当然也欢迎加我微信,拉你进技术交流群!
    “转发” 加 “在看”,养成好习惯!咱们下期再见!

    在这里插入图片描述

  • 相关阅读:
    【Visual C++】游戏开发五十二 浅墨DirectX教程二十 骨骼动画来袭(一)
    转:骨骼动画教程及微软示例Skinned Mesh的解析(一)
    分布式系统的session共享问题
    相关官网文档地址
    10DSL查询文档语法查询分类和基本语法
    InitializingBean接口
    11DSL查询语法全文检索查询精确查询地理查询
    go基础系列~并发协程
    leetcode(c++)(区间DP)
    简单聊聊mysql的脏读、不可重复读、幻读
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13295903.html
Copyright © 2020-2023  润新知