Elasticsearch —— bulk批量导入数据

本文介绍如何使用Elasticsearch的bulk命令批量导入数据,包括index、delete、update等操作。通过示例展示了bulk命令的具体用法,并讨论了其在Logstash中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

449064-20160330233037832-694810006.png

对于其他的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。执行命令后,发现文件中的配置会覆盖掉路径中的配置。这样也提供了统一的默认配置以及个性化的特殊配置的需求。

449064-20160330233050457-1496318510.png

其他

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

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

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

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

posted @ 2016-03-30 23:22 xingoo 阅读( ...) 评论( ...) 编辑 收藏
### Elasticsearch 批量插入方法 #### 使用 `_bulk` API 进行批量插入 Elasticsearch 提供了强大的处理能力来高效执行多个文档的操作。对于批量插入,可以通过发送HTTP请求到`_bulk`端点实现[^2]。 ```json POST /_bulk { "index" : { "_index" : "test", "_id" : "1" } } { "field1" : "value1" } { "index" : { "_index" : "test", "_id" : "2" } } { "field1" : "value2" } ``` 每一对动作元数据和文档主体之间用换行符分隔开。这种结构允许在一个单一的HTTP调用中指定任意数量的动作及其对应的文档内容[^3]。 #### Java客户端批量插入实例 除了直接通过RESTful接口提交JSON外,在Java应用程序里也可以利用官方提供的高级抽象——BulkProcessor来进行更简便高效的批量写入操作[^4]: ```java @Resource private BulkProcessor bulkProcessor; public void batchInsert(List<Entity> entityList){ for(Entity entity : entityList){ bulkProcessor.add( new IndexRequest("your_index") .source(JSONUtil.toJsonStr(entity), XContentType.JSON)); } } ``` 这段代码展示了如何创建一个循环遍历实体列表并将每个对象作为新记录加入待处理队列等待后续统一提交给集群节点进行存储。 #### Shell脚本方式批量导入 如果拥有预先准备好的JSON文件,则可以直接借助命令行工具如curl一次性加载大量数据进入目标索引内[^5]: ```bash curl -XPUT 'localhost:9200/_bulk' \ -H "Content-Type: application/json" \ --data-binary @request.json ``` 这里假设本地存在名为`request.json`的数据源文件,其内部包含了按照上述格式编写的多条记录描述信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值