Elasticsearch 官方提供了很多版本的 Java 客户端,包含但不限于:
Transport
客户端Java REST
客户端Low Level REST
客户端High Level REST
客户端Java API
客户端非官方的 Java 客户端,包含但不限于:
Jest
客户端BBoss
客户端Spring Data Elasticsearch
客户端 ......写出来的就接近十款客户端!
Elasticsearch java 客户端
各个版本的发展演进历史、选择哪个、如何选择是本篇文章要解决的问题。
Elasticsearch Transport
客户端生命周期:Elasticsearch 0.9 版本(2010年7月27日)生,Elasticsearch 7.0.0版本(2019年04月10日)弃用,Elasticsearch 8.0 版本(2022年02月11日)彻底移除(removed)。
Transport
客户端使用 Elasticsearch 传输协议(transport protocol of Elasticsearch)和 Elasticsearch 通信。
Elasticsearch 传输协议也就是大家熟知的 9300 端口通信的那个协议,该协议负责节点之间互相通信的。如果客户端的版本与集群版本不一致可能出现兼容性问题。
本文介绍的所有客户端中,仅 Transport
客户端使用的是 Elasticsearch 传输协议,其他客户端都是 Http 协议。
更加通俗一点说:仅有 Transport
客户端使用 9300 端口(默认),其他都是 9200 端口(默认)。
Transport 客户端缺点:
https://www.elastic.co/guide/en/elasticsearch/client/java-api/0.90/java-api.html
https://www.elastic.co/cn/blog/the-elasticsearch-java-high-level-rest-client-is-out
Java REST Client
发布版本:5.0 版本(2016年10月26日)。
官方对 Java REST Client
的解读为:Elasticsearch 的官方“低级“客户端。允许通过 http 协议与 Elasticsearch 集群通信。与所有 Elasticsearch 版本兼容。
官方醒目的标记了“deprecated”已弃用。
较Transport
客户端,Java REST
客户端特点如下:
在 Elasticsearch 5.6 版本(2017年9月12日)的时候,REST 客户端衍生为两种:
https://www.elastic.co/guide/en/elasticsearch/client/java-rest/5.0/index.html
Low Level Rest
5.6 版本(2017年9月11日)单独分割出来,之前统一叫:Java REST 客户端。
Elasticsearch 官方“低级”客户端,官方强调的一个特点:它与所有 Elasticsearch 版本兼容。
注意:下文提到的 High Level REST
客户端已被废弃,但是:Low Level REST
客户端到 8.X 版本依然健在。
https://stackoverflow.com/questions/62340904/elasticsearch-rest-high-level-client-vs-elasticsearch-rest-client
High Level REST
客户端 5.6.0 版本(2017年9月11日)推出,已于 7.15.0 版本(2021年09月22日)废弃。
Elasticsearch 官方“高级“客户端 基于 Low Level REST
客户端,并扩展了 Low Level REST
客户端 的类和接口。
Java High Level REST
客户端较 Low Level REST
客户端的优势如下:
举个例子:发送请求的代码,看如下两种客户端不同写法。
Low Level REST
客户端写法如下:
Request request = new Request("GET", "/posts/_search");
High Level Rest
客户端写法如下:
SearchRequest searchRequest = new SearchRequest("posts");
可以看出,Low Level REST
方式相对“原始”、“笨拙”。
使用 High Level Rest
客户端上工作就像在 Elasticsearch 的 API 层(通过 HTTP 包间接工作),而Low Level REST
客户端纯粹是在 HTTP 上工作,什么都得自己构造。
帮助开发人员像使用 Kibana 一样关联 ES API 使用。
举个通俗的例子,直接看图。
VS
两个图一对比就更明显了,Low Level REST
客户端 什么都得自己来,High Level REST
客户端都封装好了,我们吃“现成”的。
https://www.elastic.co/guide/en/elasticsearch/client/java-rest/5.6/java-rest-high.html
7.16 版本(2021年12月8日)推出 Elasticsearch Java API Client
。
值得注意的是:7.17 版本的 High Level REST 客户端可以与 8.X 版本以兼容模式运行。
其实大家可能和我一样都有疑问:High Level
不香吗?为啥还要换?
其实官方在“ElasticCC: The new Elasticsearch Java Client: getting started and behind the scenes”给出了详尽的解读。
概括如下:
相关依赖超过 30 MB,且很多都是非必要相关的。
api 暴露了很多服务器内部接口。
仍需要大量的维护工作。
仍需要自己借助字节缓存区实现。
https://github.com/elastic/elasticsearch-java
Elasticsearch Java API 客户端官方定义如下:
Elasticsearch Java API 客户端为所有的 Elasticsearch API 提供请求和响应处理。
它将请求处理转给 Elasticsearch Low Level REST 客户端,这也是 High Level 被废弃而 Low Level REST 客户端依然健在的原因,Low Level REST 客户端负责处理 Http 连接建立和池化、重试机制等所有传输级别的问题。
Elasticsearch Java API Client 三个典型特点:
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。该模式增强了客户端代码的可用性和可读性。
举例如下:
分层 DSL 接近 elasticsearch 的 json 格式。
https://github.com/elastic/elasticsearch-java
Http REST
客户端,2017年左右还比较新颖,我还做过推荐。
但,最新一次更新是 2 年前,所以已不推荐使用。
原因:Elasticsearch 版本更迭太快,不做新版本适配,很多功能都可用或至少不好用。
https://github.com/searchbox-io/Jest
https://esdoc.bbossgroups.com/#/
国产的能适应 1.X——8.X 所有版本的 java rest 客户端。
最新版本为:Spring Data Elasticsearch 4.4,支持 Elasticsearch 7.17.3 版本。
8.X 尚不支持,之前的观察看,更新较慢。
使用 Spring Data,High Level REST Client 是默认客户端,且仍然支持 Java Transport 客户端,目 前尚不支持 Elasticsearch Java API 客户端。
Spring data Elasticsearch 官方文档如下:
https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/
实现推荐参考:
https://developer.okta.com/blog/2022/02/16/spring-data-elasticsearch
选型关注要点:
如果当前是:7.X 版本且不考虑升级,那就 High Level REST
客户端。
如果当前是:8.X 版本,那就 Elasticsearch Java API
客户端。
如果当前是:5.X、6.X 版本,推荐尽早升级集群版本。
JEST
已不更新和维护,不推荐使用。
BBoss
客户端,根据自己业务需要做选型。
Spring 框架的 Web 项目,可以使用 Spring Data Elasticsearch,但关注它的更新版本,截止:2022-06-17,支持到:7.17.3 版本。
随着 Elasticsearch 的版本快速更迭,Elasticsearch java 客户端也在随之变化。
本文以时间为主线梳理了 Elasticsearch 官方 java 客户端的演进历史,并列举常见的非 Elasticsearch 客户端。
Elasticsearch java 客户端琳琅满目、“乱花渐欲迷人眼”,但我们需要结合集群版本、集群的过去和将来,以发展的眼光选型适合自己的 Elasticsearch 客户端。
你的 Elasticsearch 集群开发使用的什么 java 客户端?有没有坑?欢迎留言交流。
via:https://blog.csdn.net/laoyang360/article/details/125342127?spm=1001.2014.3001.5501