来聊一聊 ElasticSearch 最新版的 Java 客户端

网站建设3年前发布
73 0 0

可能不少小伙伴都注意到了,从 ElasticSearch7.17 这个版本开始,原先的 Java 高级客户端 Java High Level REST Client 废弃了,不支持了。老实说,ElasticSearch 算是我用过的所有 Java 工具中,更新最为激进的一个了,在 Es7 中废弃了 TransportClient,7.17 又废弃了 TransportClient,那么现在用啥呢?现在的客户端叫做 Elasticsearch Java API Client。,一直偷懒选择无视 Elasticsearch Java API Client,不过最近工作中用到了,所以还是整篇文章和小伙伴们简单梳理一下 Elasticsearch Java API Client 的玩法。,下面的介绍我主要从索引操作和文档操作两个方面来给大家介绍。,不过需要跟大家强调的是,ElasticSearch 的 Java 客户端想要用的 6,必须要熟悉 ElasticSearch 的查询脚本,大家平时在工作中遇到 Es 相关的问题,我也都是建议先在 Kibana 中把操作脚本写好,然后再翻译成 Java 代码,或者直接拷贝到 Java 代码中,非常不建议上来就整 Java 代码,那样很容易出错。,如果你对 Es 的操作不熟悉,松哥录了免费的视频教程,大家可以参考:,https://www.bilibili.com/video/BV1ft4y1e7tq/,20230306153326c96139d127af60aeffa745b65c53af8e80cef7856,Elasticsearch Java API Client 是 Elasticsearch 的官方 Java API,这个客户端为所有 Elasticsearch APIs 提供强类型的请求和响应。,这里跟大家解释下什么是强类型的请求和响应:因为所有的 Elasticsearch APIs 本质上都是一个 RESTful 风格的 HTTP 请求,所以当我们调用这些 Elasticsearch APIs 的时候,可以就当成普通的 HTTP 接口来对待,例如使用 HttpUrlConnection 或者 RestTemplate 等工具来直接调用,如果使用这些工具直接调用,就需要我们自己组装 JSON 参数,然后自己解析服务端返回的 JSON。而强类型的请求和响应则是系统把请求参数封装成一个对象了,我们调用对象中的方法去设置就可以了,不需要自己手动拼接 JSON 参数了,请求的结果系统也会封装成一个对象,不需要自己手动去解析 JSON 参数了。,小伙伴们看一下下面这个例子,我想查询 books 索引中,书名中包含 Java 关键字的图书:,小伙伴们看到,这就是一个普通的 HTTP 请求,请求参数就是查询的条件,这个条件是一个 JSON 字符串,需要我们自己组装,请求的返回值也是一个 JSON 字符串,这个 JSON 字符串也需要我们自己手动去解析,这种可以算是弱类型的请求和响应。,Elasticsearch Java API Client 具有如下特性:,关于第三点,松哥吐槽一句,确实简洁,但是可读性一般般吧。,另外还有两点需要注意:,好了,那就不废话了,开整吧。,首先需要我们加依赖,对 JDK 的版本要求是 1.8,我们需要添加如下两个依赖:,如果是 Spring Boot 项目,就不用添加第二个依赖了,因为 Spring Boot 的 Web 中默认已经加了这个依赖了,但是 Spring Boot 一般需要额外添加下面这个依赖,出现这个原因是由于从 JavaEE 过渡到 JakartaEE 时衍生出来的一些问题,这里我就不啰嗦了,咱们直接加依赖即可:,接下来我们需要用我们的 Java 客户端和 ElasticSearch 之间建立连接,建立连接的方式如下:,小伙伴们看到,这里一共有三个步骤:,上面这个是创建了一个阻塞的 Java 客户端,当然我们也可以创建非阻塞的 Java 客户端,如下:,只有第三步和前面的不一样,其他都一样。,利用阻塞的 Java 客户端操作 Es 的时候会发生阻塞,也就是必须等到 Es 给出响应之后,代码才会继续执行;非阻塞的 Java 客户端则不会阻塞后面的代码执行,非阻塞的 Java 客户端一般通过回调函数处理请求的响应值。,有时候,我们可能还需要和 Es 之间建立 HTTPS 连接,那么需要在前面代码的基础之上,再套上一层 SSL,如下:,好了,关于建立连接,差不多就这些点。,Elasticsearch Java API Client 中最大的特色就是建造者模式+Lambda 表达式。例如,我想创建一个索引,方式如下:,小伙伴们看到,这里都是建造者模式和 Lambda 表达式,方法名称其实都很好理解(前提是你得熟悉 ElasticSearch 操作脚本),例如:,反正这里的方法都是见名知义的,上面这个就类似于下面这个请求:,小伙伴们在写的时候,脑子里要先有下面这个脚本,然后 Java 方法可以顺手拈来了。,最终创建好的索引如下图:,2023030701452769ba31129d92266ec2c1854b76c2aae405f96c477,有的小伙伴可能觉得调这一大堆方法太啰里啰唆了,来个简单的,直接上 JSON,那也不是不可以,如下:,这是直接把 JSON 参数给拼接出来,就不需要一堆建造者+Lambda 了。,如果你想删除索引呢?如下:,这个表示删除一个名为 my-index 的索引。,好了,关于索引的操作我就说这两点。,可能有的小伙伴会说,ElasticSearch 中创建索引可以配置很多参数你都没讲。在我看来,哪些很多参数其实跟这个 Java API 没有多大关系,只要你会写查询脚本,就自然懂得 Java API 中该调用哪个方法,退一万步讲,你会脚本,不懂 Java API 的方法,那么就像上面那样,直接把你的 JSON 拷贝过来,作为 Java API 的参数即可。,先来看文档的添加操作。,如下表示我想给一个名为 books 的索引中添加一个 id 为 890 的书:,添加成功之后,返回的 IndexResponse 对象其实就是对下面这个 JSON 的封装:,20230306153746c32470e620a1a455d286193716e9bd0274e82a246,现在我们只需要调用相应的方法,就可以获取到 JSON 相关的属性了。,如下表示删除 books 索引中 id 为 891 的文档:,删除这里我用了异步非阻塞的客户端来给小伙伴们演示的,异步非阻塞的话,就使用 whenComplete 方法处理回调就行了,里边有两个参数,一个是正常情况下返回的对象,另外一个则是出错时候的异常。,最后,就是查询了。这应该是大家日常开发中使用较多的功能项了,不过我还是前面的态度,查询的关键不在 Java API,而在于你对 ElasticSearch 脚本的掌握程度。,所以我这里举个简单的例子,小伙伴们大致了解下 Java API 的方法即可:,上面这个例子是一个 term 查询,查询 books 索引中书名 name 中包含 java 关键字的图书,等价于下面这个查询:,如果希望能够对查询关键字分词之后查询,那么可以使用 match 查询,如下:,为了让小伙伴们看到这个 Java 客户端的不同用法,上面两个查询的例子,我分别使用了构造查询请求和建造者+Lambda 的方式。,match 查询就调用 match 方法就行了,设置查询关键字即可,这个查询等价于下面这个查询:,如果你觉得这种调用各种方法拼接参数的方式不习惯,那么也可以直接上 JSON,如下:,可以看到,直接把查询的 JSON 参数传进来也是可以的。这样我们就可以先在 Kibana 中写好脚本,然后直接将脚本拷贝到 Java 代码中来执行就行了。,好啦,关于 Es 中新的 Java 客户端,我就和大家说这么多,最后再强调一下,这其实不是重点,玩 Es 的重点是把 Es 的各种查询参数搞懂,那么 Java 代码其实就是顺手拈来的事了。,最后,如果大家对 Es 不熟悉,可以看看松哥录的这个免费视频教程:,https://www.bilibili.com/video/BV1ft4y1e7tq/

© 版权声明

相关文章