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

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

作者:java架构师小芷 时间: 2021-02-05 09:43:15
java架构师小芷 2021-02-05 09:43:15
【摘要】摘要 
最近想把我的mall项目升级下,支持SpringBoot 2.3.0 版本。升级过程中发现需要升级Elasticsearch到7.x版本,学习过我的mall项目的朋友应该知道, 我用的Elasticsearch是6.x版本,升级到7.x以后ElasticsearchTemplate都不让用了。本文记录了Elasticsearch从6.x升级到7.x所遇到的一些问题,给大家排排坑! 
...

摘要

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

版本选择

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

  • 首先我们可以在pom.xml中修改SpringBoot依赖的版本为2.3.0
 org.springframework.boot spring-boot-starter-parent 2.3.0.RELEASE  

复制代码
  • 然后在项目的External Libraries中搜索elasticsearch,可以发现elasticsearch-7.6.2.jar这个依赖;

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

 

 

  • 然后打开其中的MANIFEST.MF文件,通过jar包中的X-Compile-Elasticsearch-Version属性,我们可以找到兼容的Elasticsearch版本号为7.6.2

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

 

 

  • 之前还有试过两个版本6.2.2版本和7.4.0版本,发现与SpringBoot 2.3.0 都有兼容性问题,所以选择合适的版本很重要!

  • 还有一点值得注意的是,如果你使用了中文分词器(IK Analysis),也要选择对应的版本7.6.2,对于使用Kibana和Logstash也是如此。

遇到的问题

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

  • application.yml中,原来我们用来配置Elasticsearch访问路径和集群名称的配置已经不建议使用了;

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

 

 

  • 取而代之的是直接配置Elasticsearch的rest访问地址;
spring:
  elasticsearch: rest: uris: http://localhost:9200
复制代码
  • 其实最大的问题还是ElasticsearchTemplate已经过时了,不建议使用了,之前复杂的数据操作用到了它;

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

 

 

 

  • 推荐使用的是ElasticsearchRestTemplate,这大概就是修改application.yml中那两个配置的原因了,修改为使用ElasticsearchRestTemplate后,我们可以发现原来ElasticsearchTemplate的query()方法已经没有了;

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

 

 

  • 可以使用ElasticsearchRestTemplate的search()方法来代替,原来的复杂查询将有以下改进;
// 使用ElasticsearchTemplate进行复杂查询
return elasticsearchTemplate.query(searchQuery, response -> { LOGGER.info("DSL:{}",searchQuery.getQuery().toString()); return convertProductRelatedInfo(response);
});
// 使用ElasticsearchRestTemplate进行复杂查询
SearchHits searchHits = elasticsearchRestTemplate.search(searchQuery, EsProduct.class);
return convertProductRelatedInfo(searchHits);
复制代码
  • 我们转换聚合结果对象的方法convertProductRelatedInfo也改进下,只是改变了方法参数类型而已;
//改进前
private EsProductRelatedInfo convertProductRelatedInfo(SearchResponse response) { //省略方法体代码...
}
//改进后
private EsProductRelatedInfo convertProductRelatedInfo(SearchHits response) { //省略方法体代码...
}
复制代码
  • 如果你觉得这样就行了,那你调用下接口就会发现,报了个类型转换异常;
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对象,具体对比如下;

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

 

 

  • 我们还发现原来使用的ElasticsearchRepository的search()方法也过时了,不建议使用了,我们以前用它做了一些复杂查询;

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

 

 

  • 我们可以改用ElasticsearchRestTemplate的search()方法来实现,具体实现对比如下;
// ElasticsearchRepository实现复杂搜索
return productRepository.search(searchQuery)
// ElasticsearchRestTemplate实现复杂搜索
SearchHits searchHits = elasticsearchRestTemplate.search(searchQuery, EsProduct.class);
if(searchHits.getTotalHits()<=0){ return new PageImpl<>(null,pageable,0);
}
List 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了。

 

勿删,copyright占位
分享文章到微博
分享文章到朋友圈

上一篇:JavaScript防抖与节流

下一篇:编程小白的毕设开发教程-filter实战

您可能感兴趣

  • QQ2000B刷屏机的源码,(Delphi,VC)双版本的

    -------------------Delphi版的:--------------program chat2001;uses  windows,messages,sysutils;{$R *.RES}const  CRLF=#13#10;  exename:pchar='刷屏机器人 2001';var//----------------------  wClass:  TWndClass;...

  • 微软准备EXCHANGE2000的升级

    Eight months after shipping Exchange Server 2000, Microsoft is still working on Service Pack 1, which will hopefully make it easier for integrators to merge disparate mail systems and address resou...

  • ERP系统实施后该做些什么

    最近业界的媒体上关于ERP的文章又多了起来,这表明国内企业对ERP的注意力正不断增强,ERP的应用又将面临一次新的高潮。但是今年早些时候的某次行业会议上却传出一个让业界震惊的结论:“中国在过去20年里,共有1000多家企业在ERP(Enterprise Resource Planning)或计算机管理系统上投入了80亿人民币,却没有一家是成功的。”许多关于ERP的文章中都引述了这个说法,直接...

  • 开始你的第一个多语言版本的dotNET 应用程序(WinForm篇)

    开始你的第一个多语言版本的dotNET 应用程序(WinForm篇)   小气的神 2001-09-22   多语言版本的应用程序曾是一个门槛,迈过去意味着它可以面对更多的使用者。对于商业程序来说一个本地化的版本意味着可能打开一个更大的市场。中文版也曾是我们心中有关中国软件的一个情结和期望。希望dotNET能给我们带来一些不同的观点和变革,让我们重新看待自己的每一个软件应用。在这里我避...

  • 联机热备份失败后,如何打开数据库?

    联机热备份失败后,如何打开数据库? 系统环境: 1、操作系统:Windows 20002、数据库: Oracle 8i R2 (8.1.6) for NT 企业版3、安装路径:C:/ORACLE错误现象: 进行联机热备份时,服务器发生故障,如掉电,重新启动服务器,启动数据库时,无法打开数据库,Oracle要求进行介质恢复,因为表空间还处在热备份状态。模拟现象及解决方法: 先将数据库设置...

  • 采用DOM模型时创建一个Select节点后,要删除option项的解决方法

    我在实际运用中,碰到了javascript的一个不足之处,是我摸索出来的一个删除option的算法。      当创建了一个select节点以后,在每次刷新的时候不需要删除次节点,但是要更新该节点的内容(options),就必须要删除原来的options,估计是语言发明人的大意吧这一点做得不够好,不能全部删除,经过多次试验才发现删除时需要用一种算法。每次只能删除options长度的一半取整。...

  • Self-Delete程序之Delphi版本,终于搞定了。 (转载)

    //转贴者:以前看过陆麟先生翻译过一篇这样的文章,是c版本的,我用delphi改写了没成功,今天去清华bbs转悠看见了这篇delphi版本的,特贴出来 发信人: Litoad (Rick), 信区: Delphi 标  题: Self-Delete程序之Delphi版本,终于搞定了。 (转载) 发信站: BBS 水木清华站 (Mon Jun  4 20:51:55 2001)   【...

  • DEBUG和RELEASE 版本差异及调试相关问题

    DEBUG和RELEASE 版本差异及调试相关问题: I.         内存分配问题 1.          变量未初始化。下面的程序在debug中运行的很好。      thing * search(thing * something)        BOOL found;        for(int i = 0; i < whatever.GetSize(); i++)      ...

CSDN

CSDN

中国开发者社区CSDN (Chinese Software Developer Network) 创立于1999年,致力为中国开发者提供知识传播、在线学习、职业发展等全生命周期服务。

华为云40多款云服务产品0元试用活动

免费套餐,马上领取!
Elasticsearch 升级 7.x 版本后,我感觉掉坑里了!介绍:华为云为您免费提供Elasticsearch 升级 7.x 版本后,我感觉掉坑里了!在博客、论坛、帮助中心等栏目的相关文章,同时还可以通过 站内搜索 查询更多Elasticsearch 升级 7.x 版本后,我感觉掉坑里了!的相关内容。| 移动地址: Elasticsearch 升级 7.x 版本后,我感觉掉坑里了! | 写博客