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,如果是服务器造成的访问延迟可能会采取重传,其他的失败就只丢弃了....

本文转自博客园xingoo的博客,原文链接:Elasticsearch —— bulk批量导入数据,如需转载请自行联系原博主。

时间: 2024-09-22 20:30:06

Elasticsearch —— bulk批量导入数据的相关文章

用QueryTable向excel批量导入数据

前面写过两篇excel操作的文章,有朋友质疑大批量数据下的性能问题,这个时候最好用批量复制的 方法,可以用excel的QueryTable来直接查询数据库,但是必须引用com组件. 参考代码: using System;using System.Collections.Generic;using System.Text;using System.Reflection;using Excel = Microsoft.Office.Interop.Excel;namespace ConsoleApp

使用Oracle sql loader批量导入数据

在性能测试中,有一项十分重要的准备工作就是准备测试数据.在进行性能测试之前,首先要保证测试数据库中有测试所需要的足够多的数据.对于数据的准备工作,有时候我会使用LoadRunner生成相应的脚本去准备数据,这样的做法有一个好处就是简便易行,然而它有一个很大的缺点就是效率太慢,当我们需要的数据量极大时,这样做是非常耗时间的,所以我觉得还需要掌握各种不同的技能来完成这个任务.以下就是我在前不久的一次测试中学到的经验: 使用oracle sql loader批量导入数据(在准备测试数据时很有用!) 生

Cassandra使用pycassa批量导入数据

本周接手了一个Cassandra系统的维护工作,有一项是需要将应用方的数据导入我们维护的Cassandra集群,并且为应用方提供HTTP的方式访问服务.这是我第一次接触KV系统,原来只是走马观花似的看过KV啊,NoSQL啊.但是实际上没有实际的使用经验.经过两天的学习和接手,终于搞明白了在生产环境中的使用方式.在此简要的笔记一下.本文主要包括的内容有: Cassandra的简介, Cassandra的相关CLI Cassandra的Python API,并且给出一个批量导入数据的例子. 1. C

.net 批量导入数据SQL Server

问题描述 刚开始学习批量导入数据,一点都不懂什么意思,求例子,带有上传控件,支持Excel2003,和2007,拜托了,大家 解决方案 解决方案二:例子代码没有,推荐使用NPOI

Django框架利用ajax实现批量导入数据功能_AJAX相关

本文实例为大家分享了网页中利用ajax实现批量导入数据功能的实现方法,供大家参考,具体内容如下 url.py代码: 复制代码 代码如下: url(r'^workimport/$', 'keywork.views.import_keywork', name='import_keywork') view.py代码: from keywork.models import DevData from django.http import JsonResponse #django ajax部分 def im

asp.net线程批量导入数据时怎么通过ajax获取执行状态

前言 最近因为工作中遇到一个需求,需要做了一个批量导入功能,但长时间运行没个反馈状态,很容易让人看了心急,产生各种臆想!为了解决心里障碍,写了这么个功能. 通过线程执行导入,并把正在执行的状态存入session,既共享执行状态,通过ajax调用session里的执行状态,从而实现反馈导入状态的功能! 上代码: 前端页面    代码如下 复制代码 <!DOCTYPE html> <htmllang="en"> <head>  <metachars

sql 利用存储过程批量导入数据

什么是存储过程 存储过程(stored procedure)是一组为了完成特定功能的sql语句集,是利用sql server所提供的transact-sql语言所编写的程序.经编译后存储在数据库教程中.存储过程是数据库中的一个重要对象,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.存储过程是由流控制和sql语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,存储过程可由应用程序通过一个调用来执行,而且允许用户声明变量 .同时,存储过程可以接收和输出参数.返回执行

php实现refresh刷新页面批量导入数据的方法_php技巧

本文实例讲述了php实现refresh刷新页面批量导入数据的方法.分享给大家供大家参考.具体分析如下: 这个功能是参考dedecms生成html页面的原理,只是dedecms使用的是js跳转而我使用的是refresh进行跳转,效果是一样的,下面我们一起来看一个php实现批量导入数据的方法. 因为我有1000W数据一次导入数据库肯定是不可行了,所以我就导致了每一次导入50条或更多数据,然后下次再刷新一次这样就可以解决这个问题了,代码如下: 复制代码 代码如下: <?php set_time_lim

elasticsearch批量导入数据注意事项

刚刚初始化启动kiabna后是没有索引的,当然,如果elasticsearch中导入过数据那么kibana会自动匹配索引 现在按照官方例子开始批量给elasticsearch导入数据 链接如下https://www.elastic.co/guide/en/kibana/6.1/tutorial-load-dataset.html 我们会依次导入如下 三块数据  1.The Shakespeare data 莎士比亚文集的数据结构 {     "line_id": INT,     &q