前言
原来项目中使用的ElasticSearch版本6.8升级到了7.5.1,且开启了x-pack安全认证,导致原来的查询接口全部使用不了。
注:原SprintBoot版本为2.1.x。
连接ElasticSearch使用的是
spring-boot-starter-data-elasticsearch
配置修改
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/><!--lookupparentfromrepository--></parent>
ES连接配置修改
原来spring-boot-starter-data-elasticsearch
连接ES的配置如下:
spring.data.elasticsearch.cluster-nodes=172.31.0.207:9300spring.data.elasticsearch.cluster-name=elk-clusterspring.data.elasticsearch.repositories.enabled=true
升级后主要使用rest接口进行连接,由于开启了x-pack
认证,所以需要修改es的账号密码,修改后配置如下:
spring.elasticsearch.rest.uris=172.31.0.207:9300spring.elasticsearch.rest.username=elasticspring.elasticsearch.rest.password=changeme
ElasticsearchTemplate升级
原来spring-boot-starter-data-elasticsearch
连接ES主要使用ElasticsearchTemplate
进行操作,新版本主要使用ElasticsearchRestTemplate
privateElasticsearchRestTemplateelasticsearchRestTemplate;
案例源码
pom文件
<projectxmlns="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
indexName="alarm-*",type="_doc") (publicclassLogDocimplementsSerializable { privatestaticfinallongserialVersionUID=6320548148250372657L; privateStringid; privateStringlogLevel; privateStringmodule; privateStringsystem; privateStringrefCode; privateStringresponse; privateStringparm; privateStringmessage; privatelonglogTime; }
- 建立LogRepository,操作底层查询
publicinterfaceLogRepositoryextendsElasticsearchRepository<LogDoc,String> { }
- 建立接口层LogService
publicinterfaceLogService { /*** 根据ID获取对应的实体* @param id 日志id* @return*/LogDocgetById(Stringid); /*** 根据时间范围查找指定格式的日志* @author javadaily* @date 2019/9/21 9:24* @param minRange 开始时间* @param maxRange 结束时间* @param logLevel 日志级别* @return 日志列表*/List<LogDoc>findRangeLogByLevel(DateTimeminRange,DateTimemaxRange,StringlogLevel); }
- 建立接口实现层LogServiceImpl
/*** @author javadaily* @date 2019/9/10 15:12*/publicclassLogServiceImplimplementsLogService { privateLogRepositorylogRepository; privateElasticsearchRestTemplateelasticsearchRestTemplate; publicLogDocgetById(Stringid) { Optional<LogDoc>logOptional=logRepository.findById(id); returnlogOptional.orElse(null); } publicList<LogDoc>findRangeLogByLevel(DateTimeminRange, DateTimemaxRange, StringlogLevel) { //需要强制转换成小写logLevel=logLevel.toLowerCase(); SearchQuerysearchQuery=newNativeSearchQueryBuilder() .withQuery(boolQuery() //module,system 必须有值才能告警 .must(existsQuery("module")) .must(existsQuery("system")) .must(termQuery("logLevel", logLevel)) .must(rangeQuery("logTime") .from(minRange.getMillis()) .to(maxRange.getMillis()))) .build(); returnelasticsearchRestTemplate.queryForList(searchQuery, LogDoc.class); } }
使用ElasticsearchRepository
与ElasticsearchRestTemplate
对ES进行操作,ElasticsearchRestTemplate
的功能比较强大,能支持更为复杂的查询,大家可以根据具体情况选择。