ElasticSearch,枯燥的基础知识讲完啦!该上 Java 客户端了!

松哥原创的 Spring Boot 视频教程已经杀青,感兴趣的小伙伴戳这里–> Spring Boot+Vue+微人事视频教程

ElasticSearch 连着搞了 28 篇,总算把基本操作和大家分享完了!
为什么我这么重视 Es 基本操作呢?很多小伙伴都在期待赶紧上 Java 客户端操作,但我还是顶着阅读崩盘的压力把基础知识更完了。原因很简单,这些基础知识太重要了。
举一个极端的例子,我们前面分享的 Es 基本操作都是 RESTful 风格的,也就是说,如果你掌握了 Es 基本操作,即使不学习 Es 的 Java 客户端,利用一些常见的 Java 网络请求工具都可以去操作 Es 了,例如 JDK 里边的 HttpUrlConnection,或者一些外部工具如 HttpClient、RestTemplate、OkHttp 等。
以 HttpUrlConnection 为例,请求方式如下:

public class HttpRequestTest {
public static void main(String[] args) throws IOException {
URL url = new URL("http://localhost:9200/books/_search?pretty=true");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
if (con.getResponseCode() == 200) {
BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));
String str = null;
while ((str = br.readLine()) != null) {
System.out.println(str);
}
}
}
}

前面视频跟大家分享的 Es 所有操作,都可以套用上面这段代码。自己构造 Http 请求、构造请求参数、构造请求体等,然后手动发送请求,再去手动解析请求结果(JSON 字符串解析而已)。只要掌握了基本操作,再去用 Java 操作 Es 就是 So Easy 了!
那么我们为什么还要去学习 Java API 呢?
学习 Java API 的意义在于,它帮我们将很多操作封装成了 API,不用自己再去手动拼 JSON 字符串了,也不用手动解析字符串了,这是它的方便之处。如果不用 Java API 的话,请求参数 JSON、响应 JSON 都需要我们手动去拼接并解析,简单的 JSON 字符串还好,复杂的 JSON 字符串就很头大了。
所以,我们还是很有必要专门来学习一下 Java API 的。
在正式开始介绍 Java 客户端之前,我先和大家稍微捋一捋目前常见的 Java 客户端都有哪些,以及各自的特点,作为一个简单的开篇。
目前 ElasticSearch 的 Java 客户端还是蛮多选择的,松哥大致上整理了一下有如下几种:

  • TransportClient
  • Jest
  • Spring Data Elasticsearch
  • Java Low Level REST Client
  • Java High Level REST Client

TransportClient

大家在网上搜索 ElasticSearch 资料时,如果找到的是两年前的资料,应该会很容易看到 TransportClient。不过从 ElasticSearch7.0 开始,官方已经不再推荐使用 TransportClient,并且表示会在 ElasticSearch8.0 中完全移除相关支持。所以如果你是刚刚开始接触 ElasticSearch,那么我觉得 TransportClient 目前可以放弃了。

Jest

Jest 提供了更流畅的 API 和更容易使用的接口,并且它的版本是遵循 ElasticSearch 的主版本号的,这样可以确保客户端和服务端之间的兼容性。
早期的 ElasticSearch 官方客户端对 RESTful 支持不够完美, Jest 在一定程度上弥补了官方客户端的不足,但是随着近两年官方客户端对 RESTful 功能的增强,Jest 早已成了明日黄花,最近的一次更新也停留在 2018 年 4 月,所以 Jest 小伙伴们也不必花时间去学了,知道曾经有过这么一个东西就行了。

Spring Data Elasticsearch

Spring Data 是 Spring 的一个子项目。用于简化数据库访问,支持NoSQL 和关系数据存储。其主要目标是使数据库的访问变得方便快捷。Spring Data 具有如下特点:
Spring Data 项目支持 NoSQL 存储:

  • MongoDB (文档数据库)
  • Neo4j(图形数据库)
  • Redis(键/值存储)
  • Hbase(列族数据库)
  • ElasticSearch

Spring Data 项目所支持的关系数据存储技术:

  • JDBC
  • JPA

从前面这段介绍中小伙伴们可以发现,Spring Data 其实是对一些既有的框架进行封装,从而使对数据的操作变得更加容易。Spring Data Elasticsearch 其实也是如此,它底层封装的就是官方的客户端 Java High Level REST Client,这个我们从它的依赖关系中就可以看出来:

老实说,Spring Data Elasticsearch 用起来还是蛮方便的,这个松哥后面会和大家分析。

Java Low Level REST Client

从字面上来理解,这个叫做低级客户端。
它允许通过 Http 与一个 Elasticsearch 集群通信。将请求的 JSON 参数拼接和响应的 JSON 字符串解析留给用户自己处理。低级客户端最大的优势在于兼容所有的 ElasticSearch 的版本(因为它的 API 并没有封装 JSON 操作,所有的 JSON 操作还是由开发者自己完成),同时低级客户端要求 JDK 为 1.7 及以上。
低级客户端主要包括如下一些功能:

  • 最小的依赖
  • 跨所有可用节点的负载均衡
  • 节点故障和特定响应代码时的故障转移
  • 连接失败重试(是否重试失败的节点取决于它失败的连续次数;失败次数越多,客户端在再次尝试同一节点之前等待的时间越长)
  • 持久连接
  • 跟踪请求和响应的日志记录
  • 可选自动发现集群节点

Java Low Level REST Client 的操作其实比较简单,松哥后面会录制一个视频和大家分享相关操作。

Java High Level REST Client

从字面上来理解,这个叫做高级客户端,也是目前使用最多的一种客户端。它其实有点像之前的 TransportClient。
这个所谓的高级客户端它的内部其实还是基于低级客户端,只不过针对 ElasticSearch 它提供了更多的 API,将请求参数和响应参数都封装成了相应的 API,开发者只需要调用相关的方法就可以拼接参数或者解析响应结果。
Java High Level REST Client 中的每个 API 都可以同步或异步调用,同步方法返回一个响应对象,而异步方法的名称则以 Async 为后缀结尾,异步请求一般需要一个监听器参数,用来处理响应结果。
相对于低级客户端,高级客户端的兼容性就要差很多(因为 JSON 的拼接和解析它已经帮我们做好了)。高级客户端需要 JDK1.8 及以上版本并且依赖版本需要与 ElasticSearch 版本相同(主版本号需要一致,次版本号不必相同)。
举个简单例子:
7.0 客户端能够与任何 7.x ElasticSearch 节点进行通信,而 7.1 客户端肯定能够与 7.1,7.2 和任何后来的 7.x 版本进行通信,但与旧版本的 ElasticSearch 节点通信时可能会存在不兼容的问题。
好啦,今天的分享就先到这里~下篇文章我们一起来学习 ElasticSearch Java 客户端的使用~
当然如果你对 ElasticSearch 基础知识还比较陌生,可以看看下面的链接~也可以去 B 站学习松哥录制的 Es 教程:https://www.bilibili.com/video/BV1ft4y1e7tq。
ElasticSearch 基础知识:

  1. 打算出一个 ElasticSearch 教程,谁赞成,谁反对?

  2. ElasticSearch 从安装开始

  3. ElasticSearch 第三弹,核心概念介绍

  4. ElasticSearch 中的中文分词器该怎么玩?

  5. ElasticSearch 索引基本操作

  6. ElasticSearch 文档的添加、获取以及更新

  7. ElasticSearch 文档的删除和批量操作

  8. ElasticSearch 文档路由,你的数据到底存在哪一个分片上?

  9. ElasticSearch 并发的处理方式:锁和版本控制

  10. ElasticSearch 中的倒排索引到底是什么?

  11. ElasticSearch 动态映射与静态映射

  12. ElasticSearch 四种字段类型详解

  13. ElasticSearch 中的地理类型和特殊类型

  14. ElasticSearch 23 种映射参数详解

  15. ElasticSearch 如何配置某个字段的权重?

  16. ElasticSearch 23 种映射参数详解【3】

  17. ElasticSearch 映射模版

  18. ElasticSearch 搜索入门

  19. ElasticSearch 全文搜索怎么玩?

  20. ElasticSearch 打错字还能搜索到?试试 fuzzy query!

  21. ElasticSearch 复合查询,理解 Es 中的文档评分策略!

  22. 想搜索附近评分较高的餐厅,ElasticSearch 大显身手!

  23. ElasticSearch 如何像 MySQL 一样做多表联合查询?

  24. ElasticSearch 地理位置查询与特殊查询

  25. ElasticSearch 搜索高亮与排序

  26. ElasticSearch 指标聚合

  27. ElasticSearch 桶聚合

  28. ElasticSearch 管道聚合