Elasticsearch —— bulk批量导入数据

在使用Elasticsearch的时候,一定会遇到这种场景——希望批量的导入数据,而不是一条一条的手动导入。那么此时,就一定会需要bulk命令! 更多内容参考我整理的Elk教程

bulk批量导入

批量导入可以合并多个操作,比如index,delete,update,create等等。也可以帮助从一个索引导入到另一个索引。

语法大致如下;

action_and_meta_data\n
optional_source\n
action_and_meta_data\n
optional_source\n
....
action_and_meta_data\n
optional_source\n

需要注意的是,每一条数据都由两行构成(delete除外),其他的命令比如index和create都是由元信息行和数据行组成,update比较特殊它的数据行可能是doc也可能是upsert或者script,如果不了解的朋友可以参考前面的update的翻译。

注意,每一行都是通过\n回车符来判断结束,因此如果你自己定义了json,千万不要使用回车符。不然_bulk命令会报错的!

一个小例子

比如我们现在有这样一个文件,data.json:

{ "index" : { "_index" : "test", "_type" : "type1", "_id" : "1" } }
{ "field1" : "value1" }

它的第一行定义了_index,_type,_id等信息;第二行定义了字段的信息。

然后执行命令:

curl -XPOST localhost:9200/_bulk --data-binary @data.json

就可以看到已经导入进去数据了。

对于其他的index,delete,create,update等操作也可以参考下面的格式:

{ "index" : { "_index" : "test", "_type" : "type1", "_id" : "1" } }
{ "field1" : "value1" }
{ "delete" : { "_index" : "test", "_type" : "type1", "_id" : "2" } }
{ "create" : { "_index" : "test", "_type" : "type1", "_id" : "3" } }
{ "field1" : "value3" }
{ "update" : {"_id" : "1", "_type" : "type1", "_index" : "index1"} }
{ "doc" : {"field2" : "value2"} }

在Url中设置默认的index和type

如果在路径中设置了index或者type,那么在JSON中就不需要设置了。如果在JSON中设置,会覆盖掉路径中的配置。

比如上面的例子中,文件中定义了索引为test,类型为type1;而我们在路径中定义了默认的选项,索引为test333,类型为type333。执行命令后,发现文件中的配置会覆盖掉路径中的配置。这样也提供了统一的默认配置以及个性化的特殊配置的需求。

其他

由于bulk是一次性提交很多的命令,它会把这些数据都发送到一个节点,然后这个节点解析元数据(index或者type或者id之类的),然后分发给其他的节点的分片,进行操作。

由于很多命令执行后,统一的返回结果,因此数据量可能会比较大。这个时候如果使用的是chunk编码的方式,分段进行传输,可能会造成一定的延迟。因此还是对条件在客户端进行一定的缓冲,虽然bulk提供了批处理的方法,但是也不能给太大的压力!

最后要说一点的是,Bulk中的操作执行成功与否是不影响其他的操作的。而且也没有具体的参数统计,一次bulk操作,有多少成功多少失败。

扩展:在Logstash中,传输的机制其实就是bulk,只是他使用了Buffer,如果是服务器造成的访问延迟可能会采取重传,其他的失败就只丢弃了....

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏奇梦博客

Xiuno BBS 4.0 目录结构 XiunoBBS

20310
来自专栏草根专栏

Git基本命令 -- 创建Git项目

在这里下载git: https://git-scm.com/ 安装的时候, 如果是windows系统的话, 可以勾选unix的命令行工具, 这样在windows...

29770
来自专栏xingoo, 一个梦想做发明家的程序员

Angular2入门体验

好的工具往往使得开发应用更快更简单,而不是任何模块都手动开发。angualr cli就是一个支持 创建工程,添加文件,对各种任务如测试、打包、部署等迭代。 本文...

29960
来自专栏点点滴滴

Centos7 配置默认防火墙Firewalld

28940
来自专栏向治洪

macOS安装Mysql数据库

最近闲来没事,想使用Node+mysql搭建一套服务器环境,并对外提供接口的方式给移动客户端和微信小程序提供数据。这里采用的服务器技术是NodeJs+Think...

24980
来自专栏Coding01

VUE 完整项目构建 -- 进阶篇

执行下述代码,即可完成项目基础构建(已配置好webpack、依赖包的安装、基本目录的生成)。

12820
来自专栏快乐八哥

ASP.NET输出JSON格式数据

一直使用WordPress3.1的版本,12月份WordPress发布了3.5的版本,想尝试升级一一下。当然最好是先在本地环境测试通过,然后上传的服务器是最好的...

349100
来自专栏性能与架构

小程序示例 - 不同页面间的消息传递

场景 假设有两个页面:用户列表页、信息编辑页 在列表中点击后某条信息后,进入编辑页面 ? 修改了用户信息后,返回到列表页,列表中需要显示修改后的信息 例如把 “...

41170
来自专栏快乐八哥

WordPress3.5安装出现的几个问题

一直使用WordPress3.1的版本,12月份WordPress发布了3.5的版本,想尝试升级一一下。当然最好是先在本地环境测试通过,然后上传的服务器是最好的...

24170
来自专栏NetCore

微信快速开发框架(三)-- 建立微信公众平台测试账号

为了测试我的快速微信开发框架,建议大家可以申请一个测试账号进行测试,稍后我也会开一个微信公众账号(不过目前很麻烦,还要我手拿身份证拍照,囧!) 第一步:您要有一...

24590

扫码关注云+社区

领取腾讯云代金券