【Elasticsearch】-批量操作

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 在ES中,提供BULK API来批量操作文档,在单个请求调用中执行多个索引或删除文档、更新文档的操作。这减少了开销,可以大大提高索引速度。

参考文档

https://www.elastic.co/guide/en/elasticsearch/reference/7.11/docs-bulk.html#bulk-api-request-body


在单个API调用中执行多个索引或删除操作。减少网络请求开销,提高索引速度。

API请求方式如下图所示:

比如以下例子,一个请求中包含index、delete、create、update四个操作

Request body

请求正文包含创建,删除,索引和更新操作以及它们关联的源数据列表。

create 如果文档不存在,在es中索引指定的文档信息

_index:当API路径中的未指定时,此参数必填

_id: 文档的id,如果未指定es回自动生成一个ID

delete从索引中删除指定的文档

_index:当API路径中的未指定时,此参数必填

_id: 文档的id,此参数必须的

index索引指定的文档。如果文档存在,则替换文档并递增版本。第二行必须包含要索引的源数据。

_index:当API路径中的未指定时,此参数必填

_id: 文档的id,如果未指定es回自动生成一个ID

update执行部分文档更新。第二行必须包含部分文档和更新选项。

_index:当API路径中的未指定时,此参数必填

_id: 文档的id,此参数必须的

doc: 索引的部分文档。更新操作所需。

fileds:文档的字段

detect_noop:默认值为true,默认情况下只有原来的source和新的source存在不同的字段情况下才会重建索引,如果一模一样是不会触发重建索引的,如果将detect_noop=false不管内容有没有变化都会重建索引,这一点可以通过version的值的变化来查看是否重建索引。

使用retry_on_conflict参数可以指定当文档冲突时,尝试更新的次数

update操作支持部分文档更新,Upsert,doc_as_upsert,script,params(for脚本),lang(for脚本)和_source。

几种方式可参照以下例子

curl-XPOST-uundefined:$ESPASS"localhost:9200/_bulk?pretty"-H'Content-Type: application/json'-d'#部分文档更新{ "update" : {"_id" : "1", "_index" : "index1", "retry_on_conflict" : 3} }
{ "doc" : {"field" : "value"} }
#支持脚本 upsert{ "update" : { "_id" : "0", "_index" : "index1", "retry_on_conflict" : 3} }
{ "script" : { "source": "ctx._source.counter += params.param1", "lang" : "painless", "params" : {"param1" : 1}}, "upsert" : {"counter" : 1}}
#支撑doc_as_upsert 如果没有就创建,又就覆盖,source如果完全相同,默认不会执行任何操作{ "update" : {"_id" : "2", "_index" : "index1", "retry_on_conflict" : 3} }
{ "doc" : {"field" : "value"}, "doc_as_upsert" : true }
#返回值显示_source信息{ "update" : {"_id" : "3", "_index" : "index1", "_source" : true} }
{ "doc" : {"field" : "value"} }
#返回值显示_source信息{ "update" : {"_id" : "4", "_index" : "index1"} }
{ "doc" : {"field" : "value"}, "_source": true}


因为是单次请求,批量操作。多个操作中可能部分操作失败,当有操作失败时,返回信息如下所示:

其中errors=true代表有失败的操作,每个error代表失败操作的原因。

若仅需要返回有关失败操作的信息,可使用Filter_Path查询参数。

返回结果如下图所示

批量操作,文档数量的设置

整个批量请求都需要由接收到请求的节点加载到内存中,因此该请求越大,其他请求所能获得的内存就越少。 批量请求的大小有一个最佳值,大于这个值,性能将不再提升,甚至会下降。 但是最佳值不是一个固定的值。它完全取决于硬件、文档的大小和复杂度、索引和搜索的负载的整体情况。

幸运的是,很容易找到这个最佳点:通过批量索引典型文档,并不断增加批量大小进行尝试。 当性能开始下降,那么你的批量大小就太大了。一个好的办法是开始时将 1,000 到 5,000 个文档作为一个批次, 如果你的文档非常大,那么就减少批量的文档个数。

密切关注你的批量请求的物理大小往往非常有用,一千个 1KB 的文档是完全不同于一千个 1MB 文档所占的物理大小。 一个好的批量大小在开始处理后所占用的物理大小约为 5-15 MB。

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
JSON API 数据格式
学好Elasticsearch系列-索引的批量操作
学好Elasticsearch系列-索引的批量操作
221 1
|
索引 Python
Python Elasticsearch批量操作客户端2
Python Elasticsearch批量操作客户端
122 0
|
JSON 测试技术 数据格式
Python Elasticsearch批量操作客户端 1
Python Elasticsearch批量操作客户端
113 0
|
运维 Java 程序员
方法 | Elasticsearch Jest 批量操作bug 根因定位排查
本文介绍Elasticsearch Jest 批量操作bug 根因定位排查的方法。
1601 0
|
API
方法 | Elasticsearch Jest 批量操作bug 根因定位排查
1、背景 使用Jest进行批量插入数据的时候,偶尔会出现如下的bug One or more of the items in the Bulk request failed, check BulkResult.getItems() for more information. 起初认为是偶发,就把并发数调小,就再没有关注。
638 0
|
分布式计算 Hadoop 索引
|
6天前
|
存储 安全 数据管理
如何在 Rocky Linux 8 上安装和配置 Elasticsearch
本文详细介绍了在 Rocky Linux 8 上安装和配置 Elasticsearch 的步骤,包括添加仓库、安装 Elasticsearch、配置文件修改、设置内存和文件描述符、启动和验证 Elasticsearch,以及常见问题的解决方法。通过这些步骤,你可以快速搭建起这个强大的分布式搜索和分析引擎。
13 5
|
1月前
|
存储 JSON Java
elasticsearch学习一:了解 ES,版本之间的对应。安装elasticsearch,kibana,head插件、elasticsearch-ik分词器。
这篇文章是关于Elasticsearch的学习指南,包括了解Elasticsearch、版本对应、安装运行Elasticsearch和Kibana、安装head插件和elasticsearch-ik分词器的步骤。
107 0
elasticsearch学习一:了解 ES,版本之间的对应。安装elasticsearch,kibana,head插件、elasticsearch-ik分词器。
|
2月前
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo