- 浏览: 2188470 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (682)
- 软件思想 (7)
- Lucene(修真篇) (17)
- Lucene(仙界篇) (20)
- Lucene(神界篇) (11)
- Solr (48)
- Hadoop (77)
- Spark (38)
- Hbase (26)
- Hive (19)
- Pig (25)
- ELK (64)
- Zookeeper (12)
- JAVA (119)
- Linux (59)
- 多线程 (8)
- Nutch (5)
- JAVA EE (21)
- Oracle (7)
- Python (32)
- Xml (5)
- Gson (1)
- Cygwin (1)
- JavaScript (4)
- MySQL (9)
- Lucene/Solr(转) (5)
- 缓存 (2)
- Github/Git (1)
- 开源爬虫 (1)
- Hadoop运维 (7)
- shell命令 (9)
- 生活感悟 (42)
- shell编程 (23)
- Scala (11)
- MongoDB (3)
- docker (2)
- Nodejs (3)
- Neo4j (5)
- storm (3)
- opencv (1)
最新评论
-
qindongliang1922:
粟谷_sugu 写道不太理解“分词字段存储docvalue是没 ...
浅谈Lucene中的DocValues -
粟谷_sugu:
不太理解“分词字段存储docvalue是没有意义的”,这句话, ...
浅谈Lucene中的DocValues -
yin_bp:
高性能elasticsearch ORM开发库使用文档http ...
为什么说Elasticsearch搜索是近实时的? -
hackWang:
请问博主,有用solr做电商的搜索项目?
Solr中Group和Facet的用法 -
章司nana:
遇到的问题同楼上 为什么会返回null
Lucene4.3开发之第八步之渡劫初期(八)
上篇文章介绍了在es里面批量读取数据的方法mget,本篇我们来看下关于批量写入的方法bulk。
bulk api可以在单个请求中一次执行多个索引或者删除操作,使用这种方式可以极大的提升索引性能。
bulk的语法格式是:
```` action and meta_data \n optional source \n action and meta_data \n optional source \n action and meta_data \n optional source \n ````
从上面能够看到,两行数据构成了一次操作,第一行是操作类型可以index,create,update,或者delete,第二行就是我们的可选的数据体,使用这种方式批量插入的时候,我们需要设置的它的Content-Type为application/json。
针对不同的操作类型,第二行里面的可选的数据体是不一样的,如下:
```` (1)index 和 create 第二行是source数据体 (2)delete 没有第二行 (3)update 第二行可以是partial doc,upsert或者是script ````
我们可以将我们的操作直接写入到一个文本文件中,然后使用curl命令把它发送到服务端:
一个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}}]} ````
注意由于我们每行必须有一个换行符,所以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"} } ````
bulk请求的返回操作的结果也是批量的,每一个action都会有具体的应答体,来告诉你当前action是成功执行还是失败 :
```` { "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请求的路径有三种和前面的mget的请求类似:
```` (1) /_bulk (2)/{index}/_bulk (3)/{index}/{type}/_bulk ````
上面的三种格式,如果提供了index和type那么在数据体里面的action就可以不提供,同理提供了index但没有type,那么就需要在数据体里面自己添加type。
此外,还有几个参数可以用来控制一些操作:
(1)数据体里面可以使用_version字段
(2)数据体里面可以使用_routing字段
(3)可以设置wait_for_active_shards参数,数据拷贝到多个shard之后才进行bulk操作
(4)refresh控制多久间隔多搜索可见
最后重点介绍下update操作,update操作在前面的文章也介绍过,es里面提供了多种更新数据的方法如:
```` (1)doc (2)upsert (3)doc_as_upsert (4)script (5)params ,lang ,source ````
在bulk里面的使用update方法和java api里面类似,前面的文章也介绍过详细的使用,现在我们看下在bulk的使用方式:
```` 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} ````其实就是非格式化的内容,放在一行然后提交就行了,不同之处在于前面的文章介绍的是单次请求,而使用bulk之后就可以一次请求批量发送多个操作了。
总结:
本篇文章介绍了在es里面bulk操作的用法,使用bulk操作我们可以批量的插入数据来提升写入性能,但针对不同的action的它的数据格式体是不一样的,这一点需要注意,同时在每行数据结束时必须加一个换行符,不然es是不能正确识别其格式的。
有什么问题可以扫码关注微信公众号:我是攻城师(woshigcs),在后台留言咨询。 技术债不能欠,健康债更不能欠, 求道之路,与君同行。
发表评论
-
复盘一个Elasticsearch排序问题的剖析
2019-07-15 21:12 1197最近线上的es查询的 ... -
elasticsearch里面的关于批量读取mget的用法
2018-04-04 16:01 1838es的api除了提供了基本 ... -
elasticsearch的查询流程分析
2018-04-02 20:29 1331我们都知道es是一个分 ... -
如何在elasticsearch里面使用深度分页功能
2018-03-28 18:13 2029前面的文章提到过es默认的from+size的分页方式返回的结 ... -
如何在Elasticsearch里面使用索引别名
2018-03-27 20:37 1684在elasticsearch里面给index起一个alias ... -
如何优雅的全量读取Elasticsearch索引里面的数据
2018-03-26 20:27 7660### (一)scroll的介绍 有时候我们可能想要读取整个 ... -
关于elaticsearch中更新数据的几种方式
2018-03-21 19:00 971作为一个成熟的框架, ... -
Elasticsearch里面的segment合并
2018-03-20 17:50 2101通过前面的文章,我 ... -
Elasticsearch如何保证数据不丢失?
2018-03-19 20:52 2145上篇文章提到过,在elasticsearch和磁盘之间还有一层 ... -
为什么说Elasticsearch搜索是近实时的?
2018-03-16 19:41 9475通过前面两篇文章的介绍,我们大概已经知道了 Elasticse ... -
Elasticsearch如何动态维护一个不可变的倒排索引
2018-03-15 21:34 1144上一篇文章中介绍了Elasticsearch中是如何搜索文本 ... -
Elasticsearch如何检索数据
2018-03-14 20:11 1096我们都知道Elasticsearch是一个全文检索引擎,那么它 ... -
如何备份ElasticSearch索引数据到HDFS上
2018-02-09 18:19 2428在ElasticSearch里面备份策略已经比较成熟了 ... -
Elasticsearch5.6.4集群搭建
2018-02-07 20:13 1346本次搭建的是一个三节点的集群 (一)es的安装 (1)下 ... -
如何使log4j生成json格式的log
2017-09-15 17:44 3851使用java开发项目时,log日志一般都是应用程序必不可少的一 ... -
理解elasticsearch的parent-child关系
2017-09-04 18:43 2845前面文章介绍了,在es里面的几种数据组织关系,包括array ... -
简述ElasticSearch里面复杂关系数据的存储方式
2017-08-18 20:10 2417在传统的数据库里面,对数据关系描述无外乎三种,一对一,一对多和 ... -
使用Java Rest Client操作Elasticsearch
2017-08-09 19:42 2274Elasticsearch作为一个成熟的开源框架,对主流的多种 ... -
ElasticSearch里面的偏好查询
2017-06-22 17:17 1307在es查询的时候我们可 ... -
ElasticSearch里面的路由功能介绍
2017-06-21 18:17 2252在ElaticSearch里面,路由 ...
相关推荐
在`bulkSaveToEs`方法中,我们使用Elasticsearch的Bulk API进行批量保存,这能显著提高插入效率。`parseLog`方法根据实际日志格式解析并转换日志数据。 为了实现“百万日志秒处理”的目标,我们需要注意优化以下几...
在.NET Core开发中,Elasticsearch已经成为一种广泛使用的全文搜索引擎,它提供了高度可扩展性和实时分析功能。这个名为"基于.netcore搜索封装ElasticSearch.zip"的压缩包,显然包含了一个针对.NET Core平台的...
通过使用 BulkProcessor,可以显著提高 Elasticsearch 在处理大批量数据时的性能。它不仅减少了网络通信的开销,还允许开发者自定义批量操作的策略和回调监听器,从而更好地控制数据的写入过程。对于需要频繁进行...
es-bulk-update-builder Elasticsearch的批量更新请求主体构建器安装$ npm install --save es-bulk-update-builder用法用法基本上如下: const BulkUpdateBuilder = require ( 'es-bulk-update-builder' ) ;...
- **服务管理**:可以使用`elasticsearch-service.bat`脚本安装为系统服务,方便管理和启动。 4. **RESTful API**: - Elasticsearch通过HTTP协议和JSON格式进行通信,提供了丰富的CRUD操作接口。 - 使用`GET`、...
在应用启动时,我们可以使用`@PostConstruct`注解的方法来初始化数据或者同步数据库中的数据到Elasticsearch: ```java @Component public class ElasticsearchInitializer { @Autowired private UserRepository...
本文档将详细介绍ElasticSearch集群部署的方法及其配置,并解释如何针对不同的操作系统进行配置,以及如何修改社会公共信息系统中的配置文件来适配ElasticSearch集群。 #### 一、ElasticSearch集群部署 ##### 1.1 ...
Elasticsearch 面试题和答案 本文档总结了 34 道 Elasticsearch 面试题和答案,涵盖了 Elasticsearch 的基础概念、索引架构、集群管理、性能优化、倒排索引、master 选举等多个方面。 一、Elasticsearch 基础...
本项目"springboot-elasticsearch-master"就是将这两者完美融合,提供了基于SpringBoot的Elasticsearch API实现,旨在简化ES的使用,让开发者能够更便捷地进行数据查询、新增、删除以及批量操作。 首先,我们需要...
**Elasticsearch.jar详解** Elasticsearch是一款强大的...了解其工作原理和使用方法,可以帮助我们构建高效、稳定的搜索和分析平台。随着版本的升级,Elasticsearch持续改进,为开发者提供了更强大、更易用的工具。
Elasticsearch提供了`bulk()` API来进行批量插入和删除。批量操作可以显著提高效率,减少网络通信次数。"批量删除"和"批量导入"的实现可能涉及到创建一个包含多个操作的BulkRequest,然后调用`execute()`方法来执行...
3. **连接Elasticsearch**:在Coprocessor中,使用Elasticsearch的Java API建立与ES集群的连接,创建索引和映射,然后将HBase中的数据写入相应的Elasticsearch索引。 4. **处理数据**:根据业务需求,可能需要对...
这通常通过Elasticsearch的Bulk API实现,或者使用工具如`elasticsearch-py`(Python客户端)或`curl`命令行工具。 一旦数据被索引,我们就可以执行各种搜索和分析操作。例如,你可以使用`GET`请求对特定账户进行...
通过运行这个`elasticsearch-demo`项目,学习者可以全面理解Elasticsearch的使用方法,包括安装、配置、索引管理、查询语句编写、性能优化等方面的知识。这不仅有助于理论学习,还能提供实践经验,为实际工作中的...
Elasticsearch是一个开源的全文搜索引擎,它以其高效、可...总之,Elasticsearch是一个强大的搜索和分析引擎,通过理解其核心概念、配置方法、API使用以及分布式特性,可以充分利用其功能来构建高性能的搜索解决方案。
使用`Elasticsearch.Net`提供的`ClusterStats`, `NodesStats`, ` IndicesStats`等方法可以实时监控集群状态、节点性能以及索引统计信息。 8. **错误处理** 在进行ES操作时,需注意异常处理,如网络错误、无效的...
例如,要“提高Elasticsearch的批量性能”,可以通过优化ES的配置,如调整bulk threads数量,或是优化es-hadoop的配置,例如调整byteSize/batchSize参数。文档还提到了启用自动ID生成的必要性,并指出了2.1.0版本中...
安装npm install -g elasticsearch-tools 安装后,您将可以使用以下命令行工具:出口 输入用法:es-export-bulk选项es-export-bulk --helpUsage: es-export-bulk [options] Options: -h, --help output usage ...
1. 数据导入优化:百度可能使用了批量导入数据的策略,如使用Elasticsearch的Bulk API,减少网络通信开销,提高导入效率。同时,通过合理的分片策略,确保数据分布均匀,降低单节点压力。 2. 查询性能提升:优化查询...