ElasticSearch7.x 升级后 SpringBoot 连不上?

本贴最后更新于 1550 天前,其中的信息可能已经斗转星移

前言

原来项目中使用的 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 的功能比较强大,能支持更为复杂的查询,大家可以根据具体情况选择。

好了,各位朋友们,本期的内容到此就全部结束啦,能看到这里的同学都是优秀的同学,下一个升职加薪的就是你了!
如果觉得这篇文章对你有所帮助的话请扫描下面二维码加个关注。
"转发" 加 "在看",养成好习惯!咱们下期再见!

  • 工具

    子曰:“工欲善其事,必先利其器。”

    273 引用 • 678 回帖
  • Elasticsearch

    Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

    116 引用 • 99 回帖 • 268 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • A09Z

    非常感谢,今天遇到版本问题,看了你的帖子,解决了。👍 😄

  • 其他回帖
  • someone
    作者

    有用就好,不过我好奇的是你怎么搜到这个帖子的!

  • ws6672s

    google😂

    1 回复
  • jianzh5
    作者

    厉害厉害