从本文开始,将与大家进入到Elasticsearch的精妙世界中来,基于当前最新的6.4.x版本。

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

1、概述
所有Elasticsearch操作都是使用Client对象执行的。Client 定义的所有API都是异步执行的。(要么使用事件监听器回调或者使用Future模式)

Elasticsearch计划在Elasticsearch 7.0中弃用TransportClient,在8.0中完全删除它。故在实际使用过程中建议您使用Java高级REST client。Rest client执行HTTP请求来执行操作,无需再序列化的Java请求。

按照官方的意思,以后ElasticSearch应该不会再为某一种具体语言单独提供客户端API,而是使用通用rest请求(http)来ElasticSearch服务器进行交互。

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

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

官方文档链接:https://www.elastic.co/guide/en/elasticsearch/client/index.html

接下来将重点分析JAVA Client与Java REST Client。
2、TransportClient详解

2.1 TransportClient概述
TransportClient 是ElasticSearch(java)客户端封装对象,使用transport远程连接到Elasticsearch集群,该transport node并不会加入集群,而是简单的向ElasticSearch集群上的节点发送请求。

transport node默认使用轮询机制进行集群内的节点进行负载均衡,尽管大多数操作(请求)可能是“两跳操作”。(图片来源于Elasticsearch权威指南)

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

默认构建TransportClient的方法如下:

// on startup
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 shutdownclient.close();

代码@1:使用空配置。

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

TransportClient级别的主要参数如下:

  • cluster.name
    指定集群名称。
  • client.transport.sniff
    是否开启集群嗅探功能,下文会详细介绍。
  • client.transport.ignore_cluster_name
    是否忽略连接节点的集群名称校验,设置为true表示忽略,避免连接的节点并不在同一个集群中。
  • client.transport.ping_timeout
    ping命令的响应超时时间,默认为5s。
  • client.transport.nodes_sampler_interval 对连接节点发送ping命令的频率,默认为5s,即常说的心跳检测间隔时间。

接下来重点描述一下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))  ;//Add transport addresses and do something with the client...

2.2 TransportClient API
TransportClient 的核心类继承图如下:

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

  • ActionFuture execute(Action action, Request request);
    返回ActionFuture,根据名称即可知道,该方法是典型的异步调用,Future模式。
  • void execute(Action action, Request request, ActionListener listener);
    无返回值,但需要传入ActionListener 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 的类图 如下:

其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,例如文档的索引、更新、查询、删除、批量查询,Search API等。


关于作者:
《RocketMQ计算内幕:RocketMQ架构设计与实现原理》作者。

《RocketMQ技术内幕》已出版上市,目前可在主流购物平台(京东、天猫等)购买,本书从源码角度深度分析了RocketMQ NameServer、消息发送、消息存储、消息消费、消息过滤、主从同步HA、事务消息;在实战篇重点介绍了RocketMQ运维管理界面与当前支持的39个运维命令;并在附录部分罗列了RocketMQ几乎所有的配置参数。本书得到了RocketMQ创始人、阿里巴巴Messaging开源技术负责人、Linux OpenMessaging 主席的高度认可并作序推荐。目前是国内第一本成体系剖析RocketMQ的书籍。

《RocketMQ技术内幕》宣传海报:


ElasticSearch Client详解相关推荐

  1. ElasticSearch搜索引擎详解-持续更新中

    ElasticSearch搜索引擎详解 1. ElasticSearch概述 1.1 elasticsearch是什么 1.2 全文搜索引擎 1.3 elasticsearch and solr 1. ...

  2. Elasticsearch Pipeline 详解

    文章目录 Ingest Node 简介 Ingest Node 简介 Pipeline.Processors Pipeline 定义 简介 Simulate Pipeline API 访问 Pipel ...

  3. elasticsearch配置文件详解

    配置文件详解 配置文件位于es根目录的config目录下面,有elasticsearch.yml和logging.yml两个配置,主配置文件是elasticsearch.yml,日志配置文件是logg ...

  4. elasticsearch-jdbc实现MySQL同步到ElasticSearch深入详解

    1.如何实现mysql与elasticsearch的数据同步? 逐条转换为json显然不合适,需要借助第三方工具或者自己实现.核心功能点:同步增.删.改.查同步. 2.mysql与elasticsea ...

  5. ElasticSearch配置详解

    2019独角兽企业重金招聘Python工程师标准>>> 配置文件详解 配置文件位于es根目录的config目录下面,有elasticsearch.yml和logging.yml两个配 ...

  6. ElasticSearch(ES)详解(二)

    ElasticSearch(ES)详解(二) 前言 一.ES集群讲解 (一)基本词条介绍 (二)集群架构原理 1.写入原理 2.检索原理 二.集群部署及管理 (一)部署集群 (二)管理集群 前言 上一 ...

  7. ElasticSearch全文详解及具体配置

    一.全文检索基础 1.什么是全文检索 将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的.这部分从非结构化数据中提取出的然 ...

  8. ElasticSearch倒排索引详解

    概述 Lucene 作为 Apache 开源的一款搜索工具,一直以来是实现搜索功能的神兵利器,现今火热的 Solr 和 Elasticsearch 均基于该工具包进行开发,而 Lucene 之所以能在 ...

  9. 【项目经验】最新最全ElasticSearch操作详解

    文章目录 一.引言 1.1 海量数据 1.2 全文检索 1.3 高亮显示 二.ES概述 2.1 ES的介绍 2.2 ES的由来 2.3 ES和Solr 2.4 倒排索引 三. ElasticSearc ...

最新文章

  1. 《一江春水向东流》之随笔
  2. 东北黑土区不同纬度农田土壤真菌分子生态网络的比较
  3. SAP WM Storage Type配置界面里的Addn to Stock
  4. 安全狗:云时代的服务器安全守护者
  5. 【iOS-cocos2d-X 游戏开发之四】Cocos2dX创建Android NDK新项目并编译导入Eclipse中正常运行!...
  6. 树莓派python教程_两个简易的树莓派初学者Python程序
  7. 联想小新增加固态硬盘后安装不了系统_4千价位也能面面俱到?小新Air14 2020锐龙版体验测试...
  8. 人,作为社会的基础单元
  9. input type=image图片按钮具有提交功能
  10. AD9如何创建原理图元件
  11. Python办公自动化之PPT幻灯片自动化:使用Python制作PPT 操作PPT
  12. 蓝牙协议 Bluetooth Profile —— GAVDP 中文翻译版
  13. 学Excel函数公式,怎能不会这个组合套路? 1
  14. 30系列显卡安装深度学习pytorch坏境
  15. 一个应届生是怎样搞定google、微软、百度、腾讯、搜狗的
  16. 【经典面试题】小程序与H5、APP、公众号的区别到底是什么?
  17. 后端开发工程师的生命周期,生命在于学习
  18. python神经网络编程pdf百度云下载-Python神经网络编程高清版.pdf
  19. JavaScript中的三个点(...)扩展运算符
  20. l流程图平行四边形_关于写作那些事之快速上手Mermaid流程图

热门文章

  1. 教你动手做一个 iOS 越狱 app
  2. Linux SSh scp使用【远程文件/目录的传输】
  3. B6-简析响应者链条
  4. 企业管理器开启和关闭数据库时出现Error Messsage
  5. Java 8新特性探究(五)重复注解(repeating annotations)
  6. 【JS】引用类型之RegExp
  7. oracle解锁用户
  8. Confluence 6 SQL 异常的问题解决
  9. 区块链技术应用——站在风口上猪都会飞
  10. 实时搜索专家Krzana正式进军金融大数据市场