SpringBoot项目ES6.8.15 升级到 ES7.4.0
前言
由于公司内部资产统一整理,并且公司内部部署有多个版本的es集群,所以有必要将目前负责项目的ES集群升级到公司同一版本7.4.0。es6到es7的升级变化还是挺大的,因此在这里做一下简单记录,
注:升级方案需要根据实际项目来定,本升级方案可能不是最优,但目前来看应该是比较适合这个项目的
1. 依赖相关
1. SpringBoot版本:2.3.12.RELEASE
2. spring.data.elasticsearch:
旧版本
xml
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<version>3.2.4.RELEASE</version>
</dependency>
新版本
xml
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<version>4.0.9.RELEASE</version>
</dependency>
spring.data.elasticsearch和ElasticSearch版本对应关系
spring.data.elasticsearch和ElasticSearch版本对应关系
3. elasticsearch
移除org.elasticsearch.elasticsearch的依赖,直接使用spring.data.elasticsearch中的elasticsearch依赖
4. spring-boot-autoconfigure
移除spring-boot-autoconfigure依赖的版本
旧版本
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.2.4.RELEASE</version>
</dependency>
新版本
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
2. mapping文件
升级es7.4后,索引的mapping文件发生了相应的变化,移除了type字段,如下所示
旧版本
json
{
"index_name": {
"mappings": {
"part": {
"properties": {
"brandCode": {
"type": "keyword"
},
"brandName": {
"type": "keyword"
},
"brands": {
"type": "keyword"
},
"enable": {
"type": "boolean"
}
}
}
}
}
}
新版本
json
{
"index_name": {
"mappings": {
"properties": {
"brandCode": {
"type": "keyword"
},
"brandName": {
"type": "keyword"
},
"brands": {
"type": "keyword"
},
"enable": {
"type": "boolean"
}
}
}
}
}
2. 配置文件
java
spring.elasticsearch.rest.uris=集群地址
spring.elasticsearch.rest.username=账号
spring.elasticsearch.rest.password=密码
3. 代码修改
- elasticsearchTemplate 修改为elasticsearchRestTemplate
- SearchQuery 修改为NativeSearchQuery
- repo.search 修改为 elasticsearchRestTemplate.search
- 之前的NativeSearchQueryBuilder可以直接设置索引别名,升级之后不支持,需要在elasticsearchRestTemplate.search()方法中通过IndexCoordinates.of(alias)参数来设置索引
- elasticsearchRestTemplate.search()方法返回值也有相应的变化,需要自行探索修改
代码示例
旧版本
java
PartsResult result = new PartsResult();
BoolQueryBuilder builder = builderPart(param);
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withIndices(alias)
.withQuery(builder)
.build();
long time = System.currentTimeMillis();
Page<SearchPart> pageResult = repo.search(searchQuery);
log.debug("search oe object time:{}",System.currentTimeMillis()-time);
新版本
java
PartsResult result = new PartsResult();
BoolQueryBuilder builder = builderPart(param);
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(builder)
.build();
long time = System.currentTimeMillis();
SearchHits<SearchPart> search = elasticsearchRestTemplate.search(searchQuery, SearchPart.class, IndexCoordinates.of(alias));
List<SearchPart> parts = new ArrayList<>();
if (search.hasSearchHits()){
for (SearchHit<SearchPart> searchHit : search.getSearchHits()) {
SearchPart content = searchHit.getContent();
parts.add(content);
}
}
log.debug("search oe object time:{}",System.currentTimeMillis()-time);
4. 总结
目前仅仅只是升级完之后可以正常使用,还需要进一步进行代码优化和错误排查。本篇文章旨在为大家升级的时候提供一个参考,有任何问题可以在评论区或者私信交流。