ElasticSearch Client详解

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: ElasticSearch Client详解

本文将重点探讨ElasticSearch Client的相关知识,主要关注TransportClient与Rest Client。Elasticsearch client 是我们进入Elasti-Search的大门。


1、概述


本文关注Elasticsearch与Java相关的API实现。所有Elasticsearch操作都是使用Client对象执行的。Client 定义的所有API都是异步执行的(要么使用事件监听器回调或者使用Future模式)。此外,客户端上的操作可以批量累积和执行。


Elasticsearch官方计划在Elasticsearch 7.0中弃TransportClient,并在8.0中完全删除它。相反,您应该使用Java高级REST client,rest client执行HTTP请求来执行操作,无需再序列化的Java请求。Java高级REST Client API目前支持更常用的api,但还需要添加更多的api。


任何缺失的api都可以通过使用带有JSON请求和响应体的低级Java REST客户机来实现。按照官方的意思,以后ElasticSearch应该不会再为某一种具体语言单独提供客户端API,而是使用通用rest请求(http)来与ElasticSearch服务器进行交互。


接下来我们会从java api开始进入ElasticSearch API的学习。

ElasticSearch Client按照编程语言提供如下实现:

108a93695a50f15a9d7f0e0150f260b7.png

接下来将重点分析JAVA Client与Java REST Client。


2、TransportClient详解



2.1 TransportClient概述



TransportClient 是ElasticSearch(java)客户端封装对象,使用transport模块远程连接到Elasticsearch集群,该transport node并不会加入集群,而是简单的向ElasticSearch集群上的节点发送请求。transport node使用轮询机制进行集群内的节点进行负载均衡,尽管大多数操作(请求)可能是“两跳操作”,其操作如图(引用在Elasticsearch权威指南)。

image.png



正如上述图所述,以一个新建操作为例,第一个请求首先发送到NODE1,然后会根据ID进行路由计算(hashcode(id)%主分片个数),例如使用p0(第一个主分片),此时NODE1会将请求转发到Node3,然后客户端发送第二个请求,会发送到NODE2上(上文中的轮询机制)。


默认构建TransportClient的方法如下

TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)    // @1
        .addTransportAddress(new TransportAddress(InetAddress.getByName("192.168.1.10"), 9300))     // @2
        .addTransportAddress(new TransportAddress(InetAddress.getByName("192.168.1.11"), 9300));   
 // on shutdown
 client.close();

代码@1:使用空配置。


代码@2:连接ElasticSearch 节点,可以通过addTransportAddress方法连接多个Node节点,这样请求会轮流发送到这些节点上,实现集群节点在接受请求时的负载均衡。


TransportClient级别的主要参数如下:

image.png

接下来重点描述一下client.transport.sniff参数,集群群嗅探机制。


在创建TransportClient时可以通过addTransportAddress来静态的增加ElasticSearch集群中的节点,如果开启集群群嗅探机制,即开启节点动态发现机制,允许动态添加和删除节点。当启用嗅探功能时,首先客户端会连接addTransportAddress中的节点上。在此之后,客户端将调用这些节点上的内部集群状态API来发现可用的数据节点。客户端的内部节点列表将仅被发现的数据数据节点替换。默认情况下,这个列表每5秒刷新一次。也就意味着如果该节点不是数据节点,则列表可能不包括它连接的原始节点。例如,如果您最初连接到一个主节点,在嗅探之后,如果发现了有其对应的数据节点,则不会再向该主节点发出请求,而是向任何数据节点发出请求。传输客户端排除非数据节点的原因是为了避免只向主节点发送搜索流量。


使用配置构建Settings构建TransportClient对象代码如下:


Settings settings = Settings.builder()
   .put(“cluster.name”, “myClusterName”)
        .put(“client.transport.sniff”, “true”).build();
TransportClient client = new PreBuiltTransportClient(settings)
   .addTransportAddress(new TransportAddress(InetAddress.getByName(“192.168.1.10”), 9300))


2.2、TransportClient API


TransportClient 的核心类继承图如下:

73f4a26ab2b6c1bc32c5d2e1ed466290.jpg

上述API的设计要点:


整个客户端API提供两个最底层的方法,execute,其关键特征如下:


  • ActionFuture<Response> execute(Action<Request, Response, RequestBuilder> action, Request request);


返回ActionFuture,根据名称即可知道,该方法是典型的异步调用,Future模式。


  • void execute(Action<Request, Response, RequestBuilder> action, Request request, ActionListener<Response> listener);


无返回值,但需要传入ActionListener<Response> listener,同样根据名称即可知道,该参数的作用是事件监听器(回调方法),也就是收到服务端响应后,调用回调函数,进行结果处理。


注意:ElasticSearch Client API 其本质是使用异步请求模式。


  • prepare 开头的方法,例如IndexRequestBuilder prepareIndex()


这类API的设计是使用Build模式,先通过build构建请求参数,最终会通过调用get()方法完成接口调用。


TransportClient Api就先解释到这里了,后续会详细对上述API进行分类详解。


2.3 Maven依懒


<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>transport</artifactId>
    <version>6.4.1</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.11.1</version>
</dependency>



3、Java Rest Client详解


Java REST客户端有两种风格:


  • Java Low Level REST Client:elasticsearch client 低级别客户端。它允许通过http请求与Elasticsearch集群进行通信。API本身不负责数据的编码解码,由用户去编码解码。它与所有的ElasticSearch版本兼容。
  • Java High Level REST Client:Elasticsearch client官方高级客户端。基于低级客户端,它定义的API,已经对请求与响应数据包进行编码解码。


3.1 Java High Level REST Client



3.1.1 初始化

RestHighLevelClient client = new RestHighLevelClient(
        RestClient.builder(
                new HttpHost("localhost", 9200, "http"),
                new HttpHost("localhost", 9201, "http")));
// close
client.close();


new HttpHost("localhost", 9200, "http")其机制与TransportClient的addTransportAddress的作用一致。


3.1.2 核心API依懒


RestHighLevelClient 的类图如下:

8d9bd6136762d321cd374cf41e7380c6.jpg


其API设计具有如下特征:


  • 每个API提供同步与异步调用,方法名以async结尾的方法为异步调用,需要提供对应的ActionListener实现。


  • 每个API都可以提供RequestOptions对象来定制请求选型。

本节将不会对上述API一一介绍,上述API会在后续文章中详细解析。


3.1.3 Maven依懒

<dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>elasticsearch-rest-client</artifactId>
        <version>6.4.0</version>
</dependency>
 <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>elasticsearch-rest-high-level-client</artifactId>
        <version>6.4.0</version>
         <type>pom</type>
</dependency>


本文就先介绍到这里了,本节详细介绍了Elasticsearch两大客户端 TransportClient与RestHighLevelClient 相关API,后续文章会详细介绍各个API的使用及其内部原理,例如文档的索引、更新、查询、删除、批量查询,Search API等原理讲解与使用示例。



相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
4天前
|
NoSQL Java API
SpringBoot【ElasticSearch集成 02】Java HTTP Rest client for ElasticSearch Jest 客户端集成(依赖+配置+增删改查测试源码)推荐使用
SpringBoot【ElasticSearch集成 02】Java HTTP Rest client for ElasticSearch Jest 客户端集成(依赖+配置+增删改查测试源码)推荐使用
63 0
|
8月前
|
Java API 数据安全/隐私保护
Elasticsearch Java API Client 开发
本场景主要介绍如何使用 Elasticsearch Java API Client 进行开发,实现常用的 CRUD 操作。
150 0
|
Java API 网络架构
ElasticSearch Client详解
详细分析介绍了Elasticsearch两大客户端TransportClient与RestHighLevelClient ,并详细介绍了es集群探测机制(client.transport.sniff)。
7131 0
|
机器学习/深度学习 缓存 安全
【最佳实践】Elasticsearch Java Rest Client快速上手(附完整示例代码包)
本文介绍Elasticsearch的Java Client的原理、版本兼容性以及使用示例,帮助您快速使用Java客户端与Elasticsearch集群进行交互,完成检索、分析等相关业务。
9176 0
【最佳实践】Elasticsearch Java Rest Client快速上手(附完整示例代码包)
|
Java 网络架构 API
High Level REST Client 访问阿里云6.3 Elasticsearch 实例实现
开发环境:InteliJ IDEA 操作系统 :macOS Mojave Elasticsearch 版本:阿里云 6.3.2_with_X-Pack 客户端版本:REST Client 6.3.2 1. 预先创建好阿里云 ES 实例,开启公网地址访问白名单。
3559 0
|
Java 网络架构 索引
Java REST Client 访问阿里云5.5 Elasticsearch 实例实现
开发环境:InteliJ IDEA 操作系统 :macOS Mojave Elasticsearch 版本:阿里云 5.5.3_with_X-Pack 客户端版本:REST Client 5.5.3 1. 预先创建好阿里云 ES 实例,开启公网地址访问白名单。
2902 0
|
Java 大数据
ElasticSearch源代码解析之Client端
看看EalsticSearch的Client端,作为入口,它代表了Client和Server交互的方式。
1390 0
Elasticsearch之client源码简要分析
转自:https://www.cnblogs.com/zhangxiaoguang/p/5824749.html elasticsearch的client主要用于发现整个es集群的可用节点(sniffer机制), 然后通过client->transport->es-node节点, node节点根据接收的请求考虑是本地处理还是需要进行转发, 接收client的节点类似协调节点负责回收所有数据并返回client端, 其中client端选择节点采用的轮询的机制。
1263 0

热门文章

最新文章