elasticsearch6.7 05. Document APIs(9)Bulk API
8、Bulk API
可以把多个index或delete操作放在单个bulk API中执行。这样可以极大地提高索引速度。
/_bulkAPI使用如下的JSON结构:
action_and_meta_data\n
optional_source\n
action_and_meta_data\n
optional_source\n
....
action_and_meta_data\n
optional_source\n
注意,最后一行数据必须要以\n结尾。发送请求时,Content-Type 标头应设置为 application /x-ndjson。
action可以是index,create,delete和update操作。index和create 操作需要在下一行指定一个文档数据。index操作相当于 index API,create操作相当于op_type=create 的index操作。delete操作不要指定文档参数,参考delete API。update操作仅需文档的部分参数,doc、upsert,script ,或其他一些可选项。
如果使用curl导入文本作为参数,你必须使用--data-binary标记而不是-d参数。使用--data-binary的json文本数据不能换行:
$ cat requests
{ "index" : { "_index" : "test", "_type" : "_doc", "_id" : "1" } }
{ "field1" : "value1" }
$ curl -s -H "Content-Type: application/x-ndjson" -XPOST localhost:9200/_bulk --data-binary "@requests"; echo
{"took":7, "errors": false, "items":[{"index":{"_index":"test","_type":"_doc","_id":"1","_version":1,"result":"created","forced_refresh":false}}]}
因为使用\n作为分割符,所以请确保json数据不是格式化的(需要在同一行)。例如:
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"} }
返回结果:
{
   "took": 30,
   "errors": false,
   "items": [
      {
         "index": {
            "_index": "test",
            "_type": "_doc",
            "_id": "1",
            "_version": 1,
            "result": "created",
            "_shards": {
               "total": 2,
               "successful": 1,
               "failed": 0
            },
            "status": 201,
            "_seq_no" : 0,
            "_primary_term": 1
         }
      },
      {
         "delete": {
            "_index": "test",
            "_type": "_doc",
            "_id": "2",
            "_version": 1,
            "result": "not_found",
            "_shards": {
               "total": 2,
               "successful": 1,
               "failed": 0
            },
            "status": 404,
            "_seq_no" : 1,
            "_primary_term" : 2
         }
      },
      {
         "create": {
            "_index": "test",
            "_type": "_doc",
            "_id": "3",
            "_version": 1,
            "result": "created",
            "_shards": {
               "total": 2,
               "successful": 1,
               "failed": 0
            },
            "status": 201,
            "_seq_no" : 2,
            "_primary_term" : 3
         }
      },
      {
         "update": {
            "_index": "test",
            "_type": "_doc",
            "_id": "1",
            "_version": 2,
            "result": "updated",
            "_shards": {
                "total": 2,
                "successful": 1,
                "failed": 0
            },
            "status": 200,
            "_seq_no" : 3,
            "_primary_term" : 4
         }
      }
   ]
}
可以使用 /_bulk, /{index}/_bulk, {index}/{type}/_bulk,在url中指定index和type参数。
每个操作都会分配到对应的分片执行,仅仅action_meta_data 数据在所请求的分片中解析(因为需要预先找出该操作在那个分片上执行)。
客户端应尽量使用{index}/{type}/_bulk减少数据传输。
返回结果会保存每个操作的返回结果,并且即使某个操作失败了也不会影响剩下的操作。
bulk api 没有规定每个bulk中应该包含多少个操作,具体操作数量应该和你操作的工作量相关。(例如工作量少可以包含多点,工作量大的包含少点)
如果使用HTTP API ,确保客户端不要发送 HTTP chunks,因为这样会降低速度。
8.1 乐观锁( Optimistic Concurrency Control)
批量API调用中的每个索引和删除操作可以在其各自的操作和元数据行中包括if_seq_no和if_primary_term参数。if_seq_no和if_primary_term参数根据对现有文档的最后一次修改来设置。有关更多详细信息,请参阅乐观并发控制。
8.2 版本号(Versioning)
每个 bulk项 都可指定 _version或version字段。它的行为和index或delete操作一样,具体还要基于映射中_version设置。它同样也支持 version_type 查阅versioning
8.3 路由(Routing)
bulk中的每一项都可以指定_routing或routing字段。它会根据_routing自动跟踪索引 / 删除操作的行为。
8.4 等待活跃分片(Wait For Active Shards)
在执行bulk之前,可以指定最小活跃分片数。有关更多详细信息和用法示例,查阅这里
8.5 刷新(refresh)
设置bulk操作所做的更改到搜索可见的时间。查阅 refresh
只有收到批量请求的分片才会受到刷新的影响。想象一下这样的请求
_bulk?refresh = wait_for,其中包含三个文档,这些文档恰好被路由到具有五个分片的索引,且请求打落在其中3个不同分片上。那么请求将会等待这三个分片刷新。其他两个分片不参与_bulk请求。
8.6 更新
使用更新操作时,retry_on_conflict可用作操作本身的字段(不在额外的有效负载行中),以指定在版本冲突的情况下应重试更新的次数。
更新操作支持的参数有:doc(部分文档)、upsert, doc_as_upsert,script, params (用于脚本), lang (用于脚本)和_source。
更新操作的示例:
POST _bulk
{ "update" : {"_id" : "1", "_type" : "_doc", "_index" : "index1", "retry_on_conflict" : 3} }
{ "doc" : {"field" : "value"} }
{ "update" : { "_id" : "0", "_type" : "_doc", "_index" : "index1", "retry_on_conflict" : 3} }
{ "script" : { "source": "ctx._source.counter += params.param1", "lang" : "painless", "params" : {"param1" : 1}}, "upsert" : {"counter" : 1}}
{ "update" : {"_id" : "2", "_type" : "_doc", "_index" : "index1", "retry_on_conflict" : 3} }
{ "doc" : {"field" : "value"}, "doc_as_upsert" : true }
{ "update" : {"_id" : "3", "_type" : "_doc", "_index" : "index1", "_source" : true} }
{ "doc" : {"field" : "value"} }
{ "update" : {"_id" : "4", "_type" : "_doc", "_index" : "index1"} }
{ "doc" : {"field" : "value"}, "_source": true}
安全
elasticsearch6.7 05. Document APIs(9)Bulk API的更多相关文章
- elasticsearch6.7 05. Document APIs(3)GET API
		
2.GET API get API 可以通过文档id从索引中获取json格式的文档,以下示例从twitter索引中获取type为_doc,id值为0为的JSON文档: GET twitter/_doc ...
 - elasticsearch6.7 05. Document APIs(2)Index API
		
Single document APIs Index API Get API Delete API Update API Multi-document APIs Multi Get API Bulk ...
 - elasticsearch6.7 05. Document APIs(6)UPDATE  API
		
5. UPDATE API 更新操作可以使用脚本来更新.更新的时候会先从索引中获取文档数据(在每个分片中的集合),然后运行脚本(使用可选的脚本语言和参数),再果进行索引(还允许删除或忽略该操作).它使 ...
 - elasticsearch6.7 05. Document APIs(4)Delete API
		
3.Delete API delete API 可以让你删除一个特定id的文档,下面例子删除twitter索引中_doc类型.id为1的文档: DELETE /twitter/_doc/1 返回结果: ...
 - elasticsearch6.7 05. Document APIs(10)Reindex API
		
9.REINDEX API Reindex要求为源索引中的所有文档启用_source. reindex 不会配置目标索引,不会复制源索引的设置.你需要在reindex之前先指定mapping,分片数量 ...
 - elasticsearch6.7 05. Document APIs(5)Delete By Query API
		
4.Delete By Query API _delete_by_query API可以删除某个匹配条件的文档: POST twitter/_delete_by_query { "query ...
 - elasticsearch6.7 05. Document APIs(8)Multi Get API
		
7.Multi Get API(Multi Get API) multi GET API 允许你一次性获取多个文档,你需要指定docs数组,其中包含了所有你需要查询的文档,每个查询结构至少包含索引,类 ...
 - elasticsearch6.7 05. Document APIs(1)data replication model
		
data replication model 本节首先简要介绍Elasticsearch的data replication model,然后详细描述以下CRUD api: 1.读写文档(Reading ...
 - elasticsearch6.7 05. Document APIs(7)Update By Query API
		
6.Update By Query API _update_by_query 接口可以在不改变 source 的情况下对 index 中的每个文档进行更新.这对于获取新属性或其他联机映射更改很有用.以 ...
 
随机推荐
- Cura - CuraEngine - 架构分析
			
参考: https://blog.csdn.net/justdoithai/article/details/52746094
 - Hadoop 系列文章(一) Hadoop 的安装,以及 Standalone Operation 的启动模式测试
			
以前都是玩 java,没搞过 hadoop,所以以此系列文章来记录下学习过程 安装的文件版本.操作系统说明 centos-6.5-x86_64 [bamboo@hadoop-senior opt]$ ...
 - oracle基础函数--decode
			
含义解释:decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译值1)ELSIF 条件=值2 THEN R ...
 - Scanner 类的使用
			
/* Scanner类的使用: 1.导类 2.创建对象 3.调用对应的方法获取数据 */ import java.util.Scanner;//导入Scanner类 public class IfDe ...
 - 微服务ServiceMesh及三种模式介绍
			
1. 前言 今年,ServiceMesh(服务网格)概念在社区里头非常火,有人提出2018年是ServiceMesh年,还有人提出ServiceMesh是下一代的微服务架构基础.作为架构师,如果你现在 ...
 - 背水一战 Windows 10 (73) - 控件(控件基类): UIElement - 拖放的基本应用, 手动开启 UIElement 的拖放操作
			
[源码下载] 背水一战 Windows 10 (73) - 控件(控件基类): UIElement - 拖放的基本应用, 手动开启 UIElement 的拖放操作 作者:webabcd 介绍背水一战 ...
 - go语言异常处理
			
go语言异常处理 error接口 go语言引入了一个关于错误错里的标准模式,即error接口,该接口的定义如下: type error interface{ Error() string } 对于要返 ...
 - [CocoaPods]入门
			
什么是CocoaPods? CocoaPods管理Xcode项目的库依赖项. 项目的依赖项在名为Podfile的单个文本文件中指定.CocoaPods将解析库之间的依赖关系,获取生成的源代码,然后在X ...
 - iptables概述
			
[参考文章]:iptables详解-朱双印个人日志 [参考文章]:linux iptables详解--个人笔记 [参考文章]:iptables详解--转 [参考文章]:linux下IPTABLES配置 ...
 - Python集成开发工具Pycharm的使用方法:复制,撤销上一步....
			
复制行,在代码行光标后,输入Ctrl + d ,即为复制一行,输入多次即为复制多行 撤销上一步操作:Ctrl + z 为多行代码加注释# 代码选中的条件下,同时按住 Ctrl+/,被选中行被注释,再 ...