首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Elasticsearch 升级 7.x 版本后,我感觉掉坑里了!

Elasticsearch 升级 7.x 版本后,我感觉掉坑里了!

作者头像
macrozheng
发布于 2020-07-30 06:19:12
发布于 2020-07-30 06:19:12
3.7K00
代码可运行
举报
文章被收录于专栏:mall学习教程mall学习教程
运行总次数:0
代码可运行

最近想把我的mall项目升级下,支持SpringBoot 2.3.0 版本。升级过程中发现需要升级Elasticsearch7.x版本,学习过我的mall项目的朋友应该知道, 我用的Elasticsearch是6.x版本,升级到7.x以后ElasticsearchTemplate都不让用了。本文记录了Elasticsearch从6.x升级到7.x所遇到的一些问题,给大家排排坑!

版本选择

既然我们要升级到Elasticsearch7.x版本,首先要选择合适的版本。如何选择合适的版本,这里有个小技巧分享给大家。

  • 首先我们可以在pom.xml中修改SpringBoot依赖的版本为2.3.0
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.0.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
  • 然后在项目的External Libraries中搜索elasticsearch,可以发现elasticsearch-7.6.2.jar这个依赖;
  • 然后打开其中的MANIFEST.MF文件,通过jar包中的X-Compile-Elasticsearch-Version属性,我们可以找到兼容的Elasticsearch版本号为7.6.2
  • 之前还有试过两个版本6.2.2版本和7.4.0版本,发现与SpringBoot 2.3.0 都有兼容性问题,所以选择合适的版本很重要!
  • 还有一点值得注意的是,如果你使用了中文分词器(IK Analysis),也要选择对应的版本7.6.2,对于使用Kibana和Logstash也是如此。

遇到的问题

选择好了合适的Elasticsearch版本后,接下来我们来讲讲升级版本遇到的问题了!

  • application.yml中,原来我们用来配置Elasticsearch访问路径和集群名称的配置已经不建议使用了;
  • 取而代之的是直接配置Elasticsearch的rest访问地址;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  elasticsearch:
    rest:
      uris: http://localhost:9200
  • 其实最大的问题还是ElasticsearchTemplate已经过时了,不建议使用了,之前复杂的数据操作用到了它;
  • 推荐使用的是ElasticsearchRestTemplate,这大概就是修改application.yml中那两个配置的原因了,修改为使用ElasticsearchRestTemplate后,我们可以发现原来ElasticsearchTemplate的query()方法已经没有了;
  • 可以使用ElasticsearchRestTemplate的search()方法来代替,原来的复杂查询将有以下改进;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 使用ElasticsearchTemplate进行复杂查询
return elasticsearchTemplate.query(searchQuery, response -> {
    LOGGER.info("DSL:{}",searchQuery.getQuery().toString());
    return convertProductRelatedInfo(response);
});
// 使用ElasticsearchRestTemplate进行复杂查询
SearchHits<EsProduct> searchHits = elasticsearchRestTemplate.search(searchQuery, EsProduct.class);
return convertProductRelatedInfo(searchHits);
  • 我们转换聚合结果对象的方法convertProductRelatedInfo也改进下,只是改变了方法参数类型而已;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//改进前
private EsProductRelatedInfo convertProductRelatedInfo(SearchResponse response) {
    //省略方法体代码...
}
//改进后
private EsProductRelatedInfo convertProductRelatedInfo(SearchHits<EsProduct> response) {
    //省略方法体代码...
}
  • 如果你觉得这样就行了,那你调用下接口就会发现,报了个类型转换异常;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2020-07-21 14:40:48.154 ERROR 11616 --- [nio-8080-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; 
nested exception is java.lang.ClassCastException: org.elasticsearch.search.aggregations.bucket.nested.ParsedNested cannot be cast to org.elasticsearch.search.aggregations.bucket.nested.InternalNested] with root cause

java.lang.ClassCastException: org.elasticsearch.search.aggregations.bucket.nested.ParsedNested cannot be cast to org.elasticsearch.search.aggregations.bucket.nested.InternalNested
 at com.macro.mall.tiny.service.impl.EsProductServiceImpl.convertProductRelatedInfo(EsProductServiceImpl.java:254) ~[classes/:na]
 at com.macro.mall.tiny.service.impl.EsProductServiceImpl.searchRelatedInfo(EsProductServiceImpl.java:229) ~[classes/:na]
 at com.macro.mall.tiny.controller.EsProductController.searchRelatedInfo(EsProductController.java:104) ~[classes/:na]
  • 我们对该问题进行修复,主要就是原来的Terms对象都被改为了ParsedTerms相关对象,比如说StringTerms被改为了ParsedStringTerms对象,具体对比如下;
  • 我们还发现原来使用的ElasticsearchRepository的search()方法也过时了,不建议使用了,我们以前用它做了一些复杂查询;
  • 我们可以改用ElasticsearchRestTemplate的search()方法来实现,具体实现对比如下;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// ElasticsearchRepository实现复杂搜索
return productRepository.search(searchQuery)
// ElasticsearchRestTemplate实现复杂搜索
SearchHits<EsProduct> searchHits = elasticsearchRestTemplate.search(searchQuery, EsProduct.class);
if(searchHits.getTotalHits()<=0){
    return new PageImpl<>(null,pageable,0);
}
List<EsProduct> searchProductList = searchHits.stream().map(SearchHit::getContent).collect(Collectors.toList());
return new PageImpl<>(searchProductList,pageable,searchHits.getTotalHits());

总结

Elasticsearch从6.x升级到7.x改动还真不是一般的大,ElasticsearchTemplate不建议使用了,改为使用ElasticsearchRestTemplate,ElasticsearchRepository实现复杂查询的方法也不建议使用了。从此我们简单的数据操作可以使用ElasticsearchRepository,而复杂的数据操作只能使用ElasticsearchRestTemplate了。

项目源码地址

https://github.com/macrozheng/mall-learning/tree/master/mall-tiny-elasticsearch

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 macrozheng 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
全面升级!一套基于Spring Boot 3+JDK17的实战项目!
这里还是先简单介绍下mall项目吧,mall项目是一套基于 SpringBoot + Vue + uni-app 实现的电商系统(Github标星60K),采用Docker容器化部署。包括前台商城项目和后台管理系统,能支持完整的订单流程!涵盖商品、订单、购物车、权限、优惠券、会员、支付等功能!
macrozheng
2024/04/25
1.5K0
全面升级!一套基于Spring Boot 3+JDK17的实战项目!
😊SpringBoot 整合 Elasticsearch (超详细).md
用户7630333
2023/12/07
3.5K0
😊SpringBoot 整合 Elasticsearch (超详细).md
02_ElasticSearch索引操作总结归纳
只要name中包含手机、手、机都会被查询出来.会对手机进行分词,多个词语之间的关系默认为or。如果要精准查询,需要将操作改为and关系.
全栈程序员站长
2021/07/13
1.4K0
ElasticSearch学习笔记(5)——SpringBoot整合ElasticSearch
本节主要介绍SpringBoot与ElasticSearch的整合,并实现简单的CRUD。
张申傲
2020/09/03
1.6K0
【全文检索_08】Spring Data Elasticsearch
  Spring Data Elasticsearch 是 Spring Data 项目的一部分,该项目旨在为新数据存储提供熟悉且一致的基于 Spring 的编程模型,同时保留特定于存储的功能。Spring Data Elasticsearch 项目提供了与 Elasticsearch 搜索引擎的集成。 Spring Data Elasticsearch 的关键功能区域是一个以 POJO 为中心的模型,该模型用于与 Elastichsearch 文档进行交互并轻松编写存储库样式的数据访问层。   从 Elasticsearch 7 开始不推荐使用 TransportClient,并将在 Elasticsearch 8 中将其删除。Spring Data Elasticsearch 也支持 TransportClient,前提是使用的 Elasticsearch 中可用,Spring Data Elasticsearch 从 4.0 版本开始已弃用使用 TransportClient 的类。现在 High Level REST Client 是 Elasticsearch 的默认客户端,它在接受并返回完全相同的请求/响应对象时直接替代 TransportClient。
Demo_Null
2021/03/02
2.5K0
【全文检索_08】Spring Data Elasticsearch
Elasticsearch项目实战,商品搜索功能设计与实现!
在SpringBoot中使用Elasticsearch本文不再赘述,直接参考《mall整合Elasticsearch实现商品搜索》即可。这里需要提一下,对于需要进行中文分词的字段,我们直接使用@Field注解将analyzer属性设置为ik_max_word即可。
macrozheng
2020/04/24
4K0
优雅而强大:用easy-es简化ElasticSearch操作
Easy-Es(简称EE)是基于Elasticsearch(简称ES)官方提供的RestHighLevelClient开发的ORM框架,旨在简化开发流程并提高效率。EE在保持RestHighLevelClient原有功能的基础上进行增强,而不做任何改变。与Mybatis-Plus(简称MP)相比,EE的用法非常相似,如果您之前使用过MP,应该能够很快上手EE。EE的设计理念是:将简单、易用和方便留给用户,而将复杂的任务交由框架来处理。
架构狂人
2023/09/21
3.2K0
优雅而强大:用easy-es简化ElasticSearch操作
mall整合Elasticsearch实现商品搜索
1.下载Elasticsearch6.2.2的zip包,并解压到指定目录,下载地址:https://www.elastic.co/cn/downloads/past-releases/elasticsearch-6-2-2
macrozheng
2019/07/22
7220
mall整合Elasticsearch实现商品搜索
ElasticSearchRepository和ElasticSearchTemplate的使用
Spring-data-elasticsearch是Spring提供的操作ElasticSearch的数据层,封装了大量的基础操作,通过它可以很方便的操作ElasticSearch的数据。
天涯泪小武
2019/01/17
10.1K2
全文搜索实战2-ik分词及搜索高亮
数据存储功能基于mybatisplus框架,实现相关entity和mapper等即可。
技术路漫漫
2020/07/12
1.8K0
横空出世!MyBatis-Plus同款ES ORM框架,用起来够优雅!
Easy-Es(简称EE)是一款基于Elasticsearch(简称ES)官方提供的RestHighLevelClient打造的ORM开发框架,在RestHighLevelClient的基础上,只做增强不做改变,为简化开发、提高效率而生。EE和Mybatis-Plus(简称MP)的用法非常相似,如果你之前使用过MP的话,应该能很快上手EE。EE的理念是:把简单、易用、方便留给用户,把复杂留给框架。
macrozheng
2022/12/14
1.3K0
横空出世!MyBatis-Plus同款ES ORM框架,用起来够优雅!
spring data操作ES简直不能再香
Elasticsearch(以下简称ES)并不像mysql这么容易上手,很多java程序员会觉得ES的java客户端比较难以掌握,尽管ES 7.x官方推荐的high level client已经相对于早期的TransportClient好用很多了。
用户7634691
2020/08/10
2.7K0
【ES三周年】吊打Elasticsearch 和Java API(进阶保姆级教程-3)
上一篇我们通过kibana的可视化界面,对es的索引以及文档的常用操作做了毕竟详细的总结,本篇将介绍如何使用java完成对es的操作,这也是实际开发中将要涉及到的。
北京-宏哥
2023/04/12
21.2K1
【ES三周年】吊打Elasticsearch 和Java API(进阶保姆级教程-3)
spring-boot-starter-data-elasticsearch整合elasticsearch 6.x实现高亮
其中elasticRepository.search(searchQuery)方法是ElasticsearchRepository接口(本文中ElasticServiceImpl 的父接口)中的方法。
程裕强
2019/05/27
2.9K0
Spring Boot & ES 实战,值得参考!
Spring Boot 2.0.5默认的elasticsearch版本很低,这里我们用最新版本6.4.1
Java技术栈
2019/09/16
3.5K0
Spring Boot & ES 实战,值得参考!
SpringData集成Elasticsearch
Spring Data 是一个用于简化数据库、非关系型数据库、索引库访问,并支持云服务的 开源框架。其主要目标是使得对数据的访问变得方便快捷,并支持 map-reduce 框架和云计 算数据服务。 Spring Data 可以极大的简化 JPA(Elasticsearch„)的写法,可以在几乎不用 写实现的情况下,实现对数据的访问和操作。除了 CRUD 外,还包括如分页、排序等一些 常用的功能。
鱼找水需要时间
2023/02/16
6840
SpringData集成Elasticsearch
Mall电商实战项目全面升级!支持最新版SpringBoot,干掉循环依赖...
mall项目采用现阶主流技术实现,这些主流技术基本都升级了目前最新稳定版,具体升级内容大家可以参考下表。
macrozheng
2022/07/24
8170
Mall电商实战项目全面升级!支持最新版SpringBoot,干掉循环依赖...
Elasticsearch 7.x Nested 嵌套类型查询 | ES 干货
注意:tring/nested/array 类型字段不能用作排序字段。因此 string 类型会升级为:text 和 keyword。keyword 可以排序,text 默认分词,不可以排序。
二哥聊运营工具
2021/12/17
4.3K0
Elasticsearch 7.x Nested 嵌套类型查询 | ES 干货
Mac下Elasticsearch7.x安装及Springboot集成
众所周知,检索是大模型RAG应用中的重要步骤。用户输入的问题,需要rag服务先使用检索模块检索到与问题最相关的知识,再进行筛选、排序、甄别、整理、总结,直到生成最终的回答。而检索结果直接关系到回答的质量。
程序员架构进阶
2025/08/12
1990
Mac下Elasticsearch7.x安装及Springboot集成
SpringBoot与检索(ElasticSearch)
Docker Hub 镜像下载地址:https://hub.docker.com/
OY
2022/03/12
8010
SpringBoot与检索(ElasticSearch)
推荐阅读
相关推荐
全面升级!一套基于Spring Boot 3+JDK17的实战项目!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验