原来项目中使用的ElasticSearch版本6.8升级到了7.5.1,且开启了x-pack安全认证,导致原来的查询接口全部使用不了。
注:原SprintBoot版本为2.1.x。
连接ElasticSearch使用的是spring-boot-starter-data-elasticsearch
本文主要讲述使用ElasticSearch6.x 升级到 ElasticSearch7.x后所需要的修改以及案例代码。
在SpringBoot2.2.x版本才支持ElasticSearch7.x,所以我们先需要升级SpringBoot版本。
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.2.2.RELEASEversion>
<relativePath/>
parent>
原来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
原来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.0modelVersion>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.2.2.RELEASEversion>
parent>
<groupId>com.jianzh5groupId>
<artifactId>esalarmartifactId>
<version>0.0.1-SNAPSHOTversion>
<name>esalarmname>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-elasticsearchartifactId>
dependency>
project>
@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;
}
@Repository
public interface LogRepository extends ElasticsearchRepository<LogDoc,String> {
}
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);
}
/**
* @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);
}
}
使用ElasticsearchRepository
与ElasticsearchRestTemplate
对ES进行操作,ElasticsearchRestTemplate
的功能比较强大,能支持更为复杂的查询,大家可以根据具体情况选择。
好了,各位朋友们,本期的内容到此就全部结束啦,能看到这里的同学都是优秀的同学,下一个升职加薪的就是你了!
如果觉得这篇文章对你有所帮助的话请扫描下面二维码加个关注,当然也欢迎加我微信,拉你进技术交流群!
“转发” 加 “在看”,养成好习惯!咱们下期再见!