一文讲解Elasticsearch java restful api 跨版本兼容解决方案

【ES】[ignore_throttled] parameter is deprecated because frozen indices have been deprecated. Consider ignore_throttled]参数已被弃用,因为冻结索引已被弃用。考虑用冷层或冻结层代替冻结指数。 阅读详情

需求来源

之前的文章elasticsearch&kibana从6.0升级到7.9完整过程记录已经已经介绍了该需求的来源,也已经将elasticsearch的server端从6.0.0升级到了7.9.0,server端的问题解决了,接下来就是client端的问题了,怎么解决下面的问题:

  1. 之前6.0.0版本使用的是elasticsearch的JAVA api,这个版本的额API在7.X版本已经变成deprecated状态,并会在8.0版本被移除,所以需要将JAVA api转化为JAVA restful api
  2. 由于公司的产品除了官服外都是在客户现场的私有化部署,由于elasticsearch的应用比较广泛加上客户为了方便管理,所以很多情况下elasticsearch集群都是直接使用客户提供或者构建的固有集群,集群的版本不固定,包含但不限于5.4.0,6.X以及未来将要升级到的7.9.0,繁杂的版本使得client端的代码兼容变成了一件无比繁杂且重要的一件事情
  3. client端的支撑要考虑到代码变更的复杂性以及工作量,尽量使用最少的工作量达到目的

方案目标

1、one stack to rule them all(一套代码解决所有问题)

2、尽量减少适配和代码维护工作量

方案详情

前后一共出了两版方案,第一版方案就是正面刚,彻底解决问题,但是适配和维护工作工作量过大,被迫放弃,第二版方案是一个这种方案,虽然可能在未来再次升级后会出现问题,但是能做到平稳过度,最大化减少代码升级以及维护的工作量,下面就分别说一说。

首先先简单科普下elasticsearch的java restful client:

  1. restful client分为high level restful api(下面简称high)和lowlevel restful api(下面简称low)
  2. 其中high是通过low实现的,而low是直接执行底层命令来获得返回结果,其中底层命令就是在kibana中执行的命令,返回值也完全一样,需要自己去手动解析
  3. 鉴于2中介绍的两者特点,理论上来说low是可以基本上做到版本完全兼容的,而high则和版本相关
  4. high出现的原因,更多的是为使用java api的项目快速适配以及方便后续使用而封装的,所以如果完全使用high的话,和java api的兼容性会很好,修改适配的工作量相对较少
  5. low一直存在,high一直在发展,6.0.0版本的high只有document相关的操作,而7.9.0则所有的操作都有high相关的实现

正面刚方案:

  1. 针对6.X和7.9.0版本,各维护一套es-client的api包,封装同样的接口供业务模块使用,这样的结果是维护一套业务代码,两套es-client的代码
  2. 这样设计的好处是业务代码解耦合,维护一套即可,屏蔽了es版本的差异;两套es-client的代码分别维护,可以最大程度的减少版本不兼容带来的各种问题,提升稳定性
  3. 但是凡事都有两面性,这样做的缺点就是服务端需要维护的额代码变多,es-client的工作量加倍,而且最重要的是,公司的业务特点就是私有化部署的客户遍及全中国,运维团队需要维护的内容多到离谱,再给他们增加es-client的适配无疑是一个很大的压力,而且繁杂度的增加带来的是犯错误的几率提升,对整个流程来说并不友好(公司团队决定的,运维人员的资源并不多)

侧面迂回方案:

    既然强攻不成,那就迂回包抄,通过某些特殊的手段,包含但不限于使用low来实现部分high无法兼容的代码,调整使用方式避开跨版本不兼容的用法,甚至修改部分源码以达到一套es-client代码适配所有业务代码以及所有版本ES的目的,当然这么做的风险是仅仅能支持6.X和7.9.0版本,对后续版本的兼容性未知,但是当前版本可以作为过渡版本,当后续ES版本更迭的时候可以淘汰掉6.X版本而专心考虑高版本(6.X和7.X的差异实在太大,兼容性搞起来有很多坑需要填....)

  1. 直接维护一套es-client的api包,在该包中封装6.X和7.9.0相关的对象以屏蔽版本的差异,另外尽量使用以前java client相关的方法体,里面的实现替换成rest-client的实现,以最大程度减少业务代码的修改。
  2. 在填坑过程中最后还是没有绕过修改elasticsearch源码,针对SearchRequest进行了一些封装,来兼容各种版本的search属性

    下面说说具体的方案实施过程:

    版本差异收集:

  1.     seq_no_primary_term:6.7版本增加的默认search属性
  2.     ignore_throttled:6.8.1版本增加的默认search属性
  3.     ccsMinimizeRoundtrips:7.0.0版本增加的默认search属性
  4.     SearchHits类的totalHits属性在6.X版本是long类型,在7.X版本是TotalHits对象属性,导致使用6.X版本client访问7.X版本的server时得到的totalHits属性为0,该问题在6.8的client中做了适配

    推进过程:

  1. 最开始的时候想使用7.9.0的high来解决所有问题,后来发现在es6.0.0版本上2,3两个属性导致所有的search返回为null,报的错误就是search不支持ignore_throttled和ccsMinimizeRoundtrips两个属性
  2. 见招拆招,选取6.8.0版本来跳过这两个我们暂时并不需要的属性,修改之后发现绝大多数的search返回结果都正常了,但是TopHitsAggregationBuilder相关的API却返回为null,报的错误是search不支持seq_no_primary_term属性
  3. 将适配的工作进行到底,经过查询发现,seq_no_primary_term是es6.7版本增加的search属性,于是将rest-client版本降到6.6.2,在6.X版本上所有问题都解决了,所有业务系统代码正常运行,还没高兴多久,在7.9.0版本的es测试中发现,search返回的总条数总是0,于是再次网上学习查看源码,发现了上面第4条中出现的问题
  4. 现在问题摆在眼前,版本冲突了,没有一个版本能兼容所有的问题了,于是痛下决心,在6.6.2的版本基础上修改elasticsearch的源码,来兼容第4条带来的问题

    下面贴出具体的核心结构与代码:

    

   上面的代码就是es-client的restful实现,EsClient里面封装了es各种基础操作的restful实现,request包中是为了屏蔽es版本差异和兼容原有es的java api实现而做的抽象,都是继承对应的request后而做的封装

   至于源码修改,就是在SearchRequest以及相关的requet中增加了totalHits4Object属性来判断,是否需要将topHits对象转为转为Long,下面就是在SearchRequest中增加的属性

   

   然后在EsClient中根据low的api获取es的版本,然后根据版本来判断该属性该如何设置

   

   hasType属性就是es版本小于7.X的标识,即es的版本为7.X时,需要将topHits对象转为转为Long,然后在search参数组织时进行判断,根据不同版本做不同的处理,具体如下:

   

   

   判断SearchRequest中的totalHits4Object来判断是否需要增加rest_total_hits_as_int属性来处理SearchRequest

    最后还需要在查询校验的时候去掉对于type的校验,防止高版本的es如es7及以上版本只会返回报错,具体做法是将IndexRequest中的相关校验注释掉。

   至此所有的坑以及问题都得以解决,暂时已经编译通过并正常运行,后续的功能以及性能测试再出现坑再去填吧,反正已经修改了源码,理论上一切问题都可以通过修改源码来解决了

后记

    工作了这么久,才第一次尝试修改源码来解决问题,很是惭愧和汗颜....但是话说回来了,第一次迈出了脚步,后续的话希望会一发而不可收拾。另外在这次解决问题和填坑的时候仔细的阅读了很多es的源码,了解了很多es的内部实现细节,也学习了很多的高级和优雅的编码用法,收获甚多。辛苦但充实,困难但开心,这也许就是作为一个技术人孜孜不倦所追求的东西吧。

Spring Boot升级踩坑记:如何解决Elasticsearch的[ignore_throttled]废弃警告(附版本对照表) 本文针对Spring Boot升级中遇到的Elasticsearch `[ignore_throttled]`废弃警告,深入剖析了其背后从“冻结索引”到“数据分层”架构的演进逻辑。文章提供了详细的Spring Boot、Spring Data与Elasticsearch版本对照表,并给出了从Spring Boot 2.5平滑升级至2.7的实战指南,帮助开发者彻底解决兼容性问题,并引导其适配新的数据分层管理范式。 阅读详情

相关推荐

Elasticsearch实战系列-RESTful API使用

上一篇文章中我们已经启动Elasticsearch了,接下来我们就可以与Elasticsearch进行通信,例如插入数据、检索数据、删除数据等等。Elasticsearch 提供了Java API和RESTful API 两种方式来与之通信。Java API如果你使用的是 JAVA,Elasticsearch 内置了两个客户端,你可以在你的代码中使用: 节点客户端: 节点客户端以一个 无数据节点

Ricky 1万+

ES已冻结索引查询不到,如何解决?

环境说明:ES 6.6及以上版本 Elastic Stack在 6.6 版中,发布了两个强大的功能:索引生命周期管理 (ILM)和冻结索引 1、如何冻结 Elasticsearch 索引? # 1、准备数据 POST /sampledata/_doc { "name":"Jane", "lastname":"Doe" } POST /sampledata/_doc { "name":"John", "lastname":"Doe" } # 2、合并碎片数据 POS.

懵懂无知的蜗牛的博客 6214

Java - Elasticsearch RestFul连接搜索查询

1. 启动elasticsearch su - elasticsearch cd /appl/elasticsearch-2.1.1/ bin/elasticsearch -d -p pid 2. curl命令 查看cluster、version:curl 'centos1:9200' 查看index:curl 'centos1:9200/_cat/indices?v' 查看1条

textboy的专栏 6017

es报错:request contains unrecognized parameter [ignore_throttled]

使用DeleteIndexRequest api删除过期数据。在使用 Springboot2.2.0 整合 ES集群5.4.0 的时候,使用 Springboot 时,使用的是 Springboot data 提供的工具,具体依赖如下: 测试代码 在新建的 Springboot 项目中,添加上面的那个依赖后,配置 yml 文件如下: 在 SpringbootTest 中添加测试内容如下: 注意,运行 testCreate 那种方法测试没有报错,但是 testDelete 报错了。 ignore_thrott

京河小蚁的博客 4171

实时搜索引擎Elasticsearch(1)——基础概念、安装和运行

Elasticsearch(简称ES)是一个基于Apache Lucene(TM)的开源搜索引擎,无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。本文介绍它的基础概念、安装、运行以及配置。

HinyLover的专栏 2万+

川崎机器人总线通信_三菱PLC和发那科机器人进行CCLINK总线通信

三菱CCLINK主站模块采用QJ61BT11N,该模块用在Q系列PLC上,如果是5U或3UPLC,可用FX5-CNV-BUS加FX3U-16CCL-M或FX5-CCL-M模块。本教程以Q系列为例CCLINK接线方法如下模块拨码含义如下接线和拨码设置好后,接着在编程软件上设置CCLINK通信参数打开编程软件,在工程导航栏打开参数——网络参数,选中CCLINK打开。打开如下画面起始IO为模块本体占用I...

weixin_42300398的博客 7546

【Elasticsearch 7.x升级8.x】代码兼容多版本ES过渡方案

es升级,并使用maven-shade-plugin修改es高版本包,兼容两个版本的es

qq_40800602的博客 7369

保姆级教程:用PyBullet在Windows/Mac上快速搭建你的第一个机器人仿真环境(附避坑指南)

本教程详细介绍了如何使用PyBullet在Windows和Mac上快速搭建机器人仿真环境,包括Python环境配置、依赖安装避坑指南、首个机械臂仿真实现及性能优化技巧。通过分步指导和实战代码,帮助初学者轻松入门机器人仿真技术。

weixin_42526087的博客 406

Elasticsearch(ES)简介及基本使用

ES 简介 ES是一个使用java语言编写的并且基于Lucene编写的搜索引擎, 他提供了分布式的全文搜索服务, 还提供了一个RESTful风格的web接口, 官方还对多种语言提供了相应的API Lucene? Lucene 本身就是一个搜索引擎的底层, ES特点 分布式: ES主要为了横向扩展能力 全文检索: 将一段词语进行分词, 并且将分出的单个词语统一的放入一个分词库中,在搜索时,根据关键字去分词库中搜索去找到想找到的内容,(倒排索引) RESTful风格web接口: 操作ES非常简单, 只需要

JAVA菜鸟 2万+

使用Simulink进行基于IIR滤波器的设计与稳定性分析仿真

IIR滤波器的稳定性与其系统函数的极点位置密切相关。如果所有极点都位于Z平面的单位圆内,则该滤波器是稳定的;否则,滤波器将是不稳定的。在设计IIR滤波器时,确保其稳定性对于避免输出信号发散至关重要。明确你的系统需求,比如输入信号类型(如正弦波)、采样率、IIR滤波器的设计参数(如滤波器类型、阶数、截止频率等)。假设我们需要设计一个低通IIR滤波器,用来去除高于500Hz的所有频率成分,保留低于500Hz的信号成分。采样率为8kHz。

xiaoheshang_123的博客 149

PyQt5简介和安装

在initUI方法中,设置了窗口的标题和大小,并创建了一个按钮。PyQt5是一个功能强大的Python界面开发框架,可以轻松创建跨平台的图形用户界面应用程序。本文介绍了PyQt5的简介和安装方法,并提供了一个简单的示例应用程序来演示PyQt5的基本用法。PyQt5是一个功能强大的Python界面开发框架,它提供了丰富的工具和组件,用于创建跨平台的图形用户界面(GUI)应用程序。信号是控件发出的事件,槽是与之关联的处理函数。接下来,我们将编写一个简单的PyQt5应用程序,以演示PyQt5的基本用法。

XdKwargs的博客 222

Elasticsearch + Kibana 实战指南:从安装部署到 C++ 客户端封装,解锁搜索引擎开发核心技能

本文从 Elasticsearch(ES)简介、安装到核心概念,结合 Kibana 可视化工具,全面讲解其分布式搜索能力。重点演示 C++ 客户端 API 封装,涵盖索引管理、CRUD 操作,并通过代码示例实现数据增删查改,来为后面项目操作做铺垫。

羑悻的博客. 5992

YOLO26 实战全流程:从数据集标注到端到端无NMS推理(完整版,附ProgLoss核心调参技巧+避坑指南)

本章节是实战经验的精华❌ 数据集标注不规范,导致模型精度低 → ✅ 严格遵守工业级标注规范,标注框紧贴目标边缘,不要漏标/多标;❌ 训练时未使用预训练权重,导致收敛极慢 → ✅ 必须开启,预训练权重能让模型快速收敛;❌ ProgLoss参数调整幅度过大,导致训练崩溃 → ✅ 每次只调整一个参数,幅度±0.02即可,循序渐进;❌ 推理时强行添加NMS参数,画蛇添足 → ✅ YOLO26无需NMS,推理命令中不要加conf/iou参数,否则会降低推理速度;

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1141

Java_ElasticSearch(ES)——分布式搜索引擎

Elasticsearch是一个开源的分布式搜索和分析引擎,最初由Elastic公司开发。它构建在Apache Lucene搜索引擎库之上,提供了一个强大的全文搜索和分析引擎,它结合kibana、Logstash、Beats,是一整套技术栈,被叫做ELK,适用于各种用例,包括文本搜索、日志分析、实时数据分析、监控和报警等。上述配置文件即表示添加扩展词典ext.dic,它就会在当前配置文件所在的目录中找这个文件。这种方式在文档id不存在时,就会相当于一个新增操作。

2509_93882485的博客 1833

爬虫:一文掌握 Pydoll 的详细使用(彻底改变浏览器自动化,且能绕过绕过验证码!)

Pydoll正在彻底改变浏览器自动化!与其他解决方案不同,它消除了对Web驱动程序的需求,提供了流畅可靠的自动化体验和本机异步性能。

数据知道的博客 1万+

WOFOST作物模型(7):6.0.6版本的PCSE使用(多层水分平衡和SNOMIN碳氮模型的集成)

wofost81文件结构如上,其中所需的参数可从github上获取然后input下有两个需要调用的功能函数py文件,需要拖到自己的运行py文件同级目录下在使用土壤模块SNOMIN进行作物生长模型模拟时,需要为土壤剖面的不同层次提供多种输入变量。这些变量通常不随年份变化,因此会统一在土壤文件中定义。本节将说明如何将这些输入变量整合到一个字典中,进而生成SNOMIN能够读取的土壤文件。

所有专家都曾始于新手 637

Elasticsearch(一、入门+SpringBoot整合ES+JavaAPI操作ES)

1-今日内容 初识 ElasticSearch 安装 ElasticSearch ElasticSearch 核心概念 操作 ElasticSearch ElasticSearch JavaAPI 2 初识ElasticSearch 2.1 基于数据库查询的问题 数据库搜索存在问题:性能较低、功能比较弱 2.2 倒排索引 倒排索引:将文档进行分词,形成词条和id的对应关系即为反向索引。 以唐诗为例,所处包含“前”的诗句 正向索引:由《静夜思》–>窗前明月光—>“前”字 反向索引:“前”

落日的博客 1万+

【测开求职】面试题:数据结构 吐血整理

本篇文章是笔者为准备研究生复试以及校招而写,因此主要针对问答,注重理解,而不在于细节计算。涵盖考研范围内的所有知识内容,读者可以先查看上面的链接走一遍数据结构的整体框架结构。其中,重点难点以及易混淆的知识点,笔者用其他近30篇文章进行了详述,在知识点处贴好了链接,有需要的可以查阅。

vector的博客 7063

基于Elasticsearch RESTFul Api操作

1.基本概念 索引(库):index 索引,相当于 database,用于管理所有的数据。 类型:type类型,相当于 table。 2. 基于RESTFul Api操作 2.1 索引管理 创建索引:相当于数据库 PUT 索引名 { } 查询索引 GET 索引名 删除索引 DELETE 索引名 2.2 映射操作 创建 PUT 索引名/_mapping/类型 { "pro...

Eros1onz的博客 455

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【SpringBoot高级篇】SpringBoot集成Elasticsearch搜索引擎

SpringBoot整合Elasticsearch1. 什么是Elasticsearch?2. 安装并运行Elasticsearch2.1 拉取镜像2.2 启动镜像3. 安装kibana3.1 拉取kibana镜像3.2 启动kibana镜像4. Elasticsearch基本概念索引(Index)文档(Document)类型(Type)文档元数据(Document metadata)字段(Fields)4.1 全文搜索(Full-text Search)倒排索引(Inverted Index)节点 &am

输入技术、输出想法 7370

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Elasticsearch RESTful API入门:全文搜索实战

在文本内容中搜索语义相关的结果(非精确匹配)示例:搜索"苹果手机"也能匹配"iPhone 13 Pro"Elasticsearch通过分词+倒排索引实现高性能搜索。

✨ 欢迎来唠嗑、切磋、一起成长!👋 1515

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

ElasticSearch

ElasticSearch基础

qq_63754844的博客 1630

ElasticSearch 全文搜索引擎

一、ElasticSearch 简介 1.什么是 ElasticSearch? Elaticsearch,简称为es, es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理 PB 级别的数据。es也使用 Java 开发并使用 Lucene 作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的 RESTful API 来隐藏 Lucene 的复杂性,从而让全文搜索变得简单。 什么是 Lucene? ES 是在之前的 Luce

qq_44704799的博客 5576

Java面试深挖:搜索引擎下的消息队列与RESTful API实践

本文以互联网大厂Java面试场景为背景,通过面试官与“小润龙”的生动对话,深入探讨了消息队列(Kafka, RabbitMQ, Redis Pub/Sub)和REST与API工具(Swagger/OpenAPI, Spring HATEOAS)在搜索引擎业务中的应用。文章不仅展现了面试过程中的问题与解答,还提供了详细的技术知识点解析、代码示例及最佳实践,旨在帮助Java开发者提升面试技巧和技术深度。

2303_76177839的博客 717

ElasticSearch全文搜索引擎基础入门

一、ES的介绍 1、ES概述 ES是一个使用Java语言并且基于Lucene编写的搜索引擎框架,他提供了分布式的全文搜索功能,提供了一个统一的基于RESTful风格的WEB接口,官方客户端也对多种语言都提供了相应的API。 Lucene:Lucene本身就是一个搜索引擎的底层。 分布式:ES主要是为了突出他的横向扩展能力。 全文检索:将一段词语进行分词,并且将分出的单个词语统一的放到一个分词库中,在搜索时,根据关键字去分词库中检索,找到匹配的内容。(倒排索引) RESTful风格的WEB接口:操作ES很简单

java编程学习_java基础教程_booyzhang的博客 515
上一篇: 转载-HBase线上生产调优建议(读写分离、RSgroup、流量控制)
下一篇: Maven编译打包报错:java.lang.NoClassDefFoundError:com.sun.tools.javac.code.TypeTags
梦回从前
博客等级 码龄18年 65粉丝 89原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值