Elasticsearch Document Bulk API 详解、原理与示例
1、BulkRequest 详解
![在这里插入图片描述](https://img-blog.csdnimg.cn/20181118220337671.png?x-oss-process=image/watermark,type_Zm 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 FuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3ByZXN0aWdlZGluZw==,size_16,color_FFFFFF,t_70)
我们先一一来看一下其 核心属性与与典型方法:
final List requests = new ArrayList<>():单个命令容器,DocWriteRequest 的子类包括:IndexRequest、UpdateRequest、DeleteRequest。
private final Set indices = new HashSet<>():List requests 涉及到的索引。
List payloads = null:有效载荷,6.4.0 版本,貌似该字段意义不大,通常命令的请求体(负载数据)存放在 DocWriteRequest 对象中,例如 IndexRequest 的 source 字段。
protected TimeValue timeout = BulkShardRequest.DEFAULT_TIMEOUT:timeout 机制,针对一个 Bulk 请求生效。
private ActiveShardCount waitForActiveShards = ActiveShardCount.DEFAULT: waitForActiveShards,针对一个 Bulk 请求生效,各个请求中 waitForActiveShards 优先。
private RefreshPolicy refreshPolicy = RefreshPolicy.NONE:刷新策略。
private long sizeInBytes = 0:整个 Bulk 请求的大小。
通过 add api 为 BulkRequest 添加一个请求。
2、Bulk API 请求格式详解
Bulk Rest 请求协议基于如下格式:
POST _bulk
{ "index" : { "_index" : "test", "_type" : "_doc", "_id" : "1" } }
{ "field1" : "value1" }
{ "delete" : { "_index" : "test", "_type" : "_doc", "_id" : "2" } }
{ "create" : { "_index" : "test", "_type" : "_doc", "_id" : "3" } }
{ "field1" : "value3" }
{ "update" : {"_id" : "1", "_type" : "_doc", "_index" : "test"} }
{ "doc" : {"field2" : "value2"} }
其请求格式定义如下(restfull):
POST 请求,其 Content-Type 为 application/x-ndjson。
每一个命令占用两行,每行的结束字符为\r\n。
第一行为元数据,“opType” : {元数据}。
第二行为有效载体(非必选),例如 Index 操作,其有效载荷为 IndexRequest#source 字段。
opType 可选值 index、create、update、delete。
公用元数据(index、create、update、delete)如下
1)_index :索引名
2)_type:类型名
3)_id:文档 ID
4)routing:路由值
5)parent
6)version:数据版本号
7)version_type:版本类型
各操作特有元数据
1、index | create
1)pipeline
2、update
1)retry_on_conflict :更新冲突时重试次数。
2)_source:字段过滤。
有效载荷说明
1、index | create
其有效载荷为_source 字段。
2、update
其有效载荷为:partial doc, upsert and script。
3、delete
没有有效载荷。
对请求格式为什么要设计成 metdata+有效载体的方式,主要是为了在接受端节点(所谓的接受端节点是指收到命令的第一节点),只需解析 metadata,然后将请求直接转发给对应的数据节点。
3、bulk API 通用特性分析
3.1 版本管理
每一个 Bulk 条目拥有独自的 version,存在于请求条目的 item 的元数据中。
3.2 路由
每一个 Bulk 条目各自生效。
3.3 Wait For Active Shards
通常可以设置 BulkRequest#waitForActiveShards 来要求 Bulk 批量执行之前要求处于激活的最小副本数。
4、Bulk Demo
评论