ElasticSearch7.x 升级后 SpringBoot 连不上?

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

前言

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

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

  • 工具

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

    295 引用 • 749 回帖
  • Elasticsearch

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

    117 引用 • 99 回帖 • 209 关注

相关帖子

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
  • someone
    作者

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

  • 其他回帖
  • ws6672s

    google😂

    1 回复
  • A09Z

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

  • jianzh5 via macOS
    作者

    厉害厉害