压缩非常奇妙,可以将数据压缩比原始大小更小。我们知道WinRaR,7Zip等压缩工具。Elasticsearch也提供压缩数据功能,可实现对在客户端和服务端节点之间传输数据的压缩。压缩对于处理大数据传输时可减少网络延迟,本文主要内容包括:启用HTTP/TCP压缩,处理Elasticsearch不同版本的压缩的响应信息。

启用HTTP/TCP压缩

ES使得修改HTTP压缩非常容易,仅仅在 elasticsearch.yml文件中提供下面属性即可:

http.compression: true
http.compression_level: 1

TCP压缩使用下面属性:

transport.compress: true

处理Elasticsearch不同版本的压缩的响应信息

前节启用了压缩,下面讨论如何处理压缩响应信息。对于TCP压缩无需任何处理,Elasticsearch使用tcp协议在不同节点之间通信能够正确解压。但启用http压缩,客户端(终端、postman、java client)需要知道如何解压缩,否则会收到无法阅读数据。下面主要聚焦java client情况。

2020.06.18 Elasticsearch7.8版本发布,其中Java库处理压缩非常容易。可以参考文档:Elasticsearch 7.8 release notes

虽然你启用了数据压缩,只有客户端请求压缩时Elasticsearch才压缩数据。java 客户端通过Http request发送额外请求选项要求压缩。请看示例:

RequestOptions.Builder requestOptions = RequestOptions.DEFAULT.toBuilder().addHeader("Accept-Encoding", "gzip").addHeader("Content-type", "application/json");

Elasticsearch 7.7 及以下版本处理压缩响应

ES的java库提供两种客户端,高级Rest客户端和低级Rest客户端。高级不支持处理压缩数据,当接收到压缩响应会直接跑车运行时异常。低级客户端提供Elasticsearch原始响应,因此可以进行解压。有多种方式实现解压,这里仅设计两种:

RequestOptions.Builder requestOptions = RequestOptions.DEFAULT.toBuilder().addHeader("Accept-Encoding", "gzip").addHeader("Content-type", "application/json");Request request = new Request("GET", "test/_search");
request.setOptions(requestOptions);
Response response = client.getLowLevelClient().performRequest(request);
byte[] entity = EntityUtils.toByteArray(response.getEntity())
String decompressedResponse = "";try (ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(entity);GZIPInputStream gzipInputStream = new GZIPInputStream(byteArrayInputStream);BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(gzipInputStream, StandardCharsets.UTF_8));) {decompressedResponse = bufferedReader.lines().collect(Collectors.joining());
}System.out.println(decompressedResponse)

也可以通过下面代码进行解压:

RequestOptions.Builder requestOptions = RequestOptions.DEFAULT.toBuilder().addHeader("Accept-Encoding", "gzip").addHeader("Content-type", "application/json");Request request = new Request("GET", "test/_search");
request.setOptions(requestOptions);
Response response = client.getLowLevelClient().performRequest(request);
String decompressedResponse = EntityUtils.toString(new GzipDecompressingEntity(response.getEntity()))System.out.println(decompressedResponse)

Elasticsearch 7.8处理压缩响应

rest高级客户端自动解压数据。上面示例可重写为:

RequestOptions.Builder requestOptions = RequestOptions.DEFAULT.toBuilder().addHeader("Accept-Encoding", "gzip").addHeader("Content-type", "application/json");SearchRequest request = new SearchRequest("twitter");
SearchResponse searchResponse = client.search(searchRequest, requestOptions);System.out.println(decompressedResponse)

作为开发者无需写额外逻辑处理响应。如果使用低级Rest客户端仍然需要自己解压缩逻辑,与上面示例一致。

Elasticsearch Release 7.9 及未来 8.0版本

随着新版功能升级,低级Rest客户端也提供了内置解压功能,可以查看pull/55413。这将大大提升java库的开发者应用体验。示例代码如下:

RequestOptions.Builder requestOptions = RequestOptions.DEFAULT.toBuilder().addHeader("Accept-Encoding", "gzip").addHeader("Content-type", "application/json");Request request = new Request("GET", "test/_search");
request.setOptions(requestOptions);Response response = client.getLowLevelClient().performRequest(request);
String responseBody = EntityUtils.toString(response.getEntity());System.out.println(responseBody);

低级Rest客户端的变化开发者需要留意。如果你已经在代码中增加了解压逻辑会抛出异常,因为尝试解压未压缩的数据。高级客户端没有变化,仍默认提供的解压功能。

总结

本文介绍了Elasticsearch响应数据压缩与解压缩功能,并给出不同版本的实现差异及示例代码。

Elasticsearch 响应数据压缩功能详解相关推荐

  1. iOS之UI--使用SWRevealViewController实现侧边菜单功能详解实例

    使用SWRevealViewController实现侧边菜单功能详解 下面通过两种方法详解SWRevealViewController实现侧边菜单功能: 1.使用StoryBoard实现 2.纯代码实 ...

  2. ElasticSearch预警服务-Watcher详解-Schedule配置

    介绍 Watcher服务详解-定时器的设定 关于Schedule配置选择,Watcher提供了丰富的时间语法支持,采用UTC时间,来我们一起看下如何设置: 支持的设置方式: hourly:按小时周期设 ...

  3. wazuh agent功能详解

    wazhu之agent功能详解 一.日志数据收集 日志数据收集是从服务器或设备生成的记录中收集的实时过程.此组件可以通过文本文件或Windows事件日志接收日志.它还可以通过远程syslog直接接收日 ...

  4. procreate功能详解_转载

    登录 在 iPad 上拥有一支「万能」画笔:Procreate 画笔功能详解 DerQi 2020 年 01 月 03 日 Procreate 是目前 iPad 上表现最出色的绘图工具之一,不仅仅体现 ...

  5. HTTP请求响应系列02_响应报文的详解

    响应报文 1.响应报文的详解 上篇文字讲的"请求报文",本篇主要解释响应报文包括的内容. 响应报文的内容也包括三部分,分别是: 响应行, 响应头, 响应体.这三部分放的都是信息.是 ...

  6. 网摘精灵教程:网摘精灵延时功能详解

    网摘精灵教程:网摘精灵延时功能详解 网摘精灵软件里面有个功能设置项是"延时",这个延时如何设置呢? 简单地说,就是发送数据一次,最多花费多久时间.这个是以秒为单位的,设置值应该是数 ...

  7. IOS视频编辑功能详解上篇-添加水印

    前言 用代码在简单视频编辑中,主要就是加美颜.水印(贴图).视频截取.视频拼接.音视频的处理,在美颜中,使用GPUImage即可实现多种滤镜.磨皮美颜的功能,并且可以脸部识别实时美颜等功能,这个有很多 ...

  8. redis stream持久化_Beetlex.Redis之Stream功能详解

    原标题:Beetlex.Redis之Stream功能详解 有一段时间没有写文章,techempower的测试规则评分竟然发生了变化,只能忘着补充一下占比权重最多的数据更新示例了和深入设计一下组件模块化 ...

  9. endnotex7怎么导入中文文献_EndNote X7自动导入PDF功能详解 | 科研动力

    在Endnote X7 新功能简介一文中对于EndNote X7的自动导入PDF功能作了一简要介绍,但是有些人对于EndNote自动导入PDF的功能还是有疑问,本文就EndNote如何自动导入PDF功 ...

最新文章

  1. linux c 之sigsuspend 进程阻塞
  2. how mang libraries do we have: 139
  3. vector的求和用法accumulate
  4. P5081 Tweetuzki爱取球(期望)(线性求逆元)
  5. 【windows】windows允许 ICMP协议(允许ping)
  6. 年底促销海报还没准备好?电商美工看这里
  7. 一种C/S架构下的 RSA + AES 组合加密方案业务流程
  8. 企业级私有registry Harbor通过https访问的详细配置
  9. 自己把握系统安全,Windows自启动程序的十大藏身之所
  10. 计算字符串长度(英文占1个字符,中文汉字占2个字符)
  11. c语言二级考试程序设计题的做题步骤,计算机二级C语言上机考试操作步骤与流程.doc...
  12. FDTD PDMS光学参数txt文档
  13. FreeIPA问题记录
  14. jpg格式电脑怎么弄_jpg图片格式如何操作
  15. 从周鼎看如何当好研究生
  16. 儿童发烧、高热,警惕病毒性感冒【程序员爸爸们学着点】
  17. 于IIS 7的HTTP 错误 500.0 - Internal Server Error(错误代码:0x800700.
  18. uvalive 3713 2-sat
  19. LPN管理中涉及到的LPN过多不能释放,导致在调拨环节零散LPN太多,如何解决该问题?
  20. [创业-39]:中小公司的组织架构与公司管理

热门文章

  1. OneDrive的申请与使用
  2. ODBC、JDBC和四种驱动类型
  3. 电蚊拍一天用30-50次?
  4. Google云计算的基础架构
  5. 人脸检测--TinaFace
  6. iOS 通过github自动打包ipa
  7. CommonJs和Es Module的区别
  8. Android--CardView详解
  9. 小白爬虫入门——装软件
  10. 任务5独立实践SQL数据模型分析