讲师中心 微信公众号
AI工具推荐 视频效率加速

在 AsyncElasticsearch 中高效执行批量操作

星墨吖_2013

星墨吖_2013

发布时间:2025-10-04 13:01:02

|

484人浏览过

|

来源于php中文网

原创

在 AsyncElasticsearch 中高效执行批量操作

本文旨在解决使用 elasticsearch-py 库中 AsyncElasticsearch 客户端时,如何异步执行批量操作的问题。针对标准 helpers.actions.bulk 不支持 AsyncElasticsearch 的局限,本文将详细介绍并演示如何利用专门为异步客户端设计的 async_helpers.bulk 函数,以实现高效、并发的数据索引、更新和删除等批量操作。

理解异步批量操作的挑战

在使用 elasticsearch-py 库进行开发时,开发者通常会根据其应用场景选择同步客户端 elasticsearch 或异步客户端 asyncelasticsearch。对于构建高性能、并发的web服务(如基于fastapi的应用),asyncelasticsearch 是首选,因为它能够充分利用异步i/o的优势。

然而,当需要执行批量操作(如一次性索引大量文档)时,许多开发者会自然想到使用 elasticsearch.helpers.bulk 函数。但一个常见的问题是,helpers.bulk 函数是为同步客户端 Elasticsearch 设计的,它不接受 AsyncElasticsearch 实例作为其 client 参数。尝试直接将 AsyncElasticsearch 客户端传递给 helpers.bulk 将导致类型不匹配或运行时错误,因为 helpers.bulk 内部使用的是同步I/O操作,无法与异步客户端的协程机制兼容。

解决方案:使用 async_helpers.bulk

为了解决 AsyncElasticsearch 客户端的批量操作需求,elasticsearch-py 库提供了一套独立的异步辅助函数。这些函数与同步版本功能类似,但专门设计用于与 AsyncElasticsearch 客户端配合,并在异步上下文中执行。

核心解决方案是使用 elasticsearch.helpers 模块中的 async_helpers.bulk 函数。这个函数是 helpers.bulk 的异步对应版本,它能够接收 AsyncElasticsearch 实例,并以非阻塞的方式执行批量索引、更新或删除操作。

async_helpers.bulk 核心用法

async_helpers.bulk 的使用模式与同步版本非常相似,主要区别在于其调用需要在 await 关键字下进行,且客户端和辅助函数本身都是异步的。

  1. 导入必要的模块:

    AI舌诊面诊问诊医疗系统+诊疗商城系统源码
    AI舌诊面诊问诊医疗系统+诊疗商城系统源码

    AI 舌诊面诊问诊医疗系统 + 诊疗商城系统源码是一套结合 AI 辅助诊断与商品转化的健康类程序,基于浩创云、ThinkPHP(PHP)开发,支持微信服务号与 H5 端,适合做中医舌诊面诊问答、健康建议推送以及配套诊疗商品的运营。

    下载
    from elasticsearch import AsyncElasticsearch
    from elasticsearch import helpers as async_helpers # 导入异步辅助函数
    import asyncio
  2. 初始化 AsyncElasticsearch 客户端: 在异步函数或 async with 语句中初始化客户端,以确保连接的正确管理。

    async def main():
        async with AsyncElasticsearch(
            cloud_id="YOUR_CLOUD_ID",
            api_key=("YOUR_API_KEY_ID", "YOUR_API_KEY_SECRET")
            # 或者 hosts=["http://localhost:9200"]
        ) as es:
            # ... 后续操作
  3. 准备操作数据: 操作数据是一个可迭代的字典序列,每个字典代表一个待执行的批量操作。每个操作字典通常包含 _index(目标索引)、_id(文档ID,可选)、_source(文档内容)以及 _op_type(操作类型,如 index、create、update、delete)。

    actions = [
        {
            "_index": "my_test_index",
            "_id": f"doc_{i}",
            "_source": {"field1": f"value{i}", "field2": i * 10}
        }
        for i in range(1, 101) # 100个文档
    ]
  4. 执行批量操作: 使用 await async_helpers.bulk(client, actions) 来执行批量操作。

    success_count, errors = await async_helpers.bulk(es, actions)
    print(f"成功索引 {success_count} 个文档。")
    if errors:
        print(f"存在 {len(errors)} 个错误:{errors}")

示例代码:异步索引文档

以下是一个完整的示例,演示如何使用 async_helpers.bulk 在 AsyncElasticsearch 中异步索引多个文档:

import asyncio
from elasticsearch import AsyncElasticsearch
from elasticsearch import helpers as async_helpers

# 假设你的Elasticsearch服务运行在本地,或者你有云服务的凭证
# 对于本地ES,通常是 http://localhost:9200
# 对于Elastic Cloud,你需要提供 cloud_id 和 api_key
ES_HOSTS = ["http://localhost:9200"]
# ES_CLOUD_ID = "YOUR_CLOUD_ID"
# ES_API_KEY_ID = "YOUR_API_KEY_ID"
# ES_API_KEY_SECRET = "YOUR_API_KEY_SECRET"

async def bulk_index_documents():
    """
    使用 async_helpers.bulk 异步批量索引文档到 Elasticsearch。
    """
    # 初始化 AsyncElasticsearch 客户端
    # 推荐使用 async with 语句管理客户端生命周期
    async with AsyncElasticsearch(hosts=ES_HOSTS) as es:
    # 如果使用 Elastic Cloud,请使用以下方式初始化
    # async with AsyncElasticsearch(
    #     cloud_id=ES_CLOUD_ID,
    #     api_key=(ES_API_KEY_ID, ES_API_KEY_SECRET)
    # ) as es:
        print("AsyncElasticsearch 客户端已连接。")

        # 1. 准备批量操作数据
        # 这是一个包含100个文档的列表,每个文档是一个字典
        # "_index" 指定目标索引
        # "_id" 是可选的文档ID,如果不提供,ES会自动生成
        # "_source" 是文档的实际内容
        documents_to_index = [
            {
                "_index": "my_async_index",
                "_id": f"doc_{i}",
                "_source": {
                    "title": f"Async Document {i}",
                    "content": f"This is the content for async document number {i}.",
                    "timestamp": f"2023-01-01T00:00:{i:02}Z"
                }
            }
            for i in range(1, 101) # 生成100个文档
        ]

        print(f"准备索引 {len(documents_to_index)} 个文档...")

        # 2. 执行批量索引操作
        # async_helpers.bulk 会返回成功处理的文档数量和遇到的错误列表
        try:
            success_count, errors = await async_helpers.bulk(
                es,
                documents_to_index,
                chunk_size=50,  # 每次发送50个文档
                raise_on_error=True, # 遇到错误时抛出异常
                raise_on_exception=True # 遇到连接异常时抛出异常
            )

            print(f"\n批量索引完成。")
            print(f"成功索引 {success_count} 个文档。")

            if errors:
                print(f"以下是遇到的错误 ({len(errors)} 个):")
                for error in errors:
                    print(f"  - {error}")
            else:
                print("没有发现错误。")

        except Exception as e:
            print(f"执行批量操作时发生异常: {e}")

        # 3. (可选)验证索引结果
        try:
            # 刷新索引以确保文档可见
            await es.indices.refresh(index="my_async_index")
            # 统计文档数量
            count_response = await es.count(index="my_async_index")
            print(f"索引 'my_async_index' 中当前文档数量: {count_response['count']}")
        except Exception as e:
            print(f"验证索引时发生错误: {e}")

# 运行异步主函数
if __name__ == "__main__":
    asyncio.run(bulk_index_documents())

参数详解与最佳实践

async_helpers.bulk 函数支持多个参数,用于控制批量操作的行为:

  • client: 必需。AsyncElasticsearch 客户端实例。
  • actions: 必需。一个可迭代对象,包含要执行的批量操作字典。
  • chunk_size: (默认 500) 每次发送到 Elasticsearch 的文档数量。适当调整此参数对性能至关重要。过大可能导致请求超时或内存压力,过小则增加网络往返开销。建议根据集群资源、网络延迟和文档大小进行测试和优化。
  • max_retries: (默认 0) 如果 Elasticsearch 返回错误(例如,由于瞬时网络问题),将尝试重试的次数。
  • initial_backoff: (默认 2) 首次重试的等待时间(秒)。
  • max_backoff: (默认 600) 最大重试等待时间(秒)。
  • raise_on_error: (默认 True) 如果任何单个文档操作失败,是否抛出 BulkIndexError。如果设置为 False,错误会包含在返回的 errors 列表中。
  • raise_on_exception: (默认 True) 如果在与 Elasticsearch 通信过程中发生任何异常(例如网络连接中断),是否抛出异常。

注意事项:

  1. 错误处理: async_helpers.bulk 返回一个元组 (success_count, errors)。errors 是一个列表,包含了所有失败的操作及其原因。即使 raise_on_error 设置为 True,也建议检查 errors 列表,以获取更详细的失败信息。
  2. 性能调优: chunk_size 是影响批量操作性能的关键参数。没有一劳永逸的最佳值,它取决于你的 Elasticsearch 集群配置、网络带宽、文档大小和集群负载。通过实验找到最适合你环境的值。
  3. 资源管理: 始终使用 async with AsyncElasticsearch(...) as es: 模式来初始化和管理 AsyncElasticsearch 客户端。这确保了客户端连接在操作完成后能够被正确关闭,避免资源泄露。
  4. 操作类型: async_helpers.bulk 不仅支持 index 和 create 操作,还支持 update 和 delete。通过在操作字典中设置 _op_type 字段来指定。

总结

在 AsyncElasticsearch 中执行批量操作时,关键在于使用专门为异步客户端设计的 async_helpers.bulk 函数。通过遵循正确的异步编程范式,并利用 async_helpers.bulk 提供的强大功能和可配置参数,开发者可以高效、可靠地处理大量数据,从而构建出高性能的异步应用程序。务必注意 chunk_size 的优化以及对操作结果中错误信息的处理,以确保数据的一致性和应用的健壮性。

热门AI工具

更多
Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

相关专题

更多
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API

Python FastAPI 异步开发利用 async/await 关键字,通过定义异步视图函数、使用异步数据库库 (如 databases)、异步 HTTP 客户端 (如 httpx),并结合后台任务队列(如 Celery)和异步依赖项,实现高效的 I/O 密集型 API,显著提升吞吐量和响应速度,尤其适用于处理数据库查询、网络请求等耗时操作,无需阻塞主线程。

119

2025.12.22

Python 微服务架构与 FastAPI 框架
Python 微服务架构与 FastAPI 框架

本专题系统讲解 Python 微服务架构设计与 FastAPI 框架应用,涵盖 FastAPI 的快速开发、路由与依赖注入、数据模型验证、API 文档自动生成、OAuth2 与 JWT 身份验证、异步支持、部署与扩展等。通过实际案例,帮助学习者掌握 使用 FastAPI 构建高效、可扩展的微服务应用,提高服务响应速度与系统可维护性。

554

2026.02.06

Python Web框架FastAPI 全栈开发教程合集
Python Web框架FastAPI 全栈开发教程合集

以 FastAPI 为核心,讲解现代 Python Web API 的高效开发方式,涵盖路由定义与路径参数/查询参数/请求体绑定、Pydantic 模型的数据校验与序列化、依赖注入(Depends)系统的分层设计、中间件与 CORS 配置、OAuth2 + JWT 认证流程、后台任务(BackgroundTasks)、WebSocket 实时通信、SQLAlchemy 异步 ORM 集成、自动生成 OpenAPI/Swagger 交互文

616

2026.05.09

Python FastAPI异步微服务与高性能接口设计
Python FastAPI异步微服务与高性能接口设计

本专题聚焦 Python FastAPI 框架在高性能接口与微服务开发中的应用,讲解异步请求处理、依赖注入机制、路由设计、数据库异步操作以及接口性能优化策略。结合实际项目案例,帮助开发者构建高并发、低延迟的现代化后端服务架构。

519

2026.06.16

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

3051

2023.11.13

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

925

2023.12.29

Elasticsearch 从入门到搜索引擎实战
Elasticsearch 从入门到搜索引擎实战

本专题带你从零掌握 Elasticsearch 分布式搜索引擎。深入解析倒排索引核心原理,涵盖单机与 Docker 环境搭建、IK 中文分词器配置及索引文档的 CRUD 操作。通过丰富的 Query DSL 实战案例,详解布尔查询、聚合分析与高亮显示,助你快速构建毫秒级响应的企业级高性能搜索服务。

39

2026.05.12

Elasticsearch 高级查询与性能优化
Elasticsearch 高级查询与性能优化

本专题深入解析 Elasticsearch 高级查询与性能优化实战。详解 Bool 复合查询、复杂过滤及聚合分析技巧,解决多条件精准检索难题。从索引设计、JVM 调优到硬件规划,全方位分享 Filter 缓存、深分页优化及集群架构调优策略,助你突破性能瓶颈,打造毫秒级响应的高并发企业级搜索服务。

64

2026.05.12

Playwright 测试失败怎么办
Playwright 测试失败怎么办

Playwright测试失败专题汇集超时、定位器匹配、浏览器提前关闭、依赖与插件配置、文件上传、SSL及Docker启动等故障文章,并介绍通过截图、报告和Trace定位错误。

20

2026.10.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kratos框架v3文档
Kratos框架v3文档

共0课时 | 0人学习

ubuntu官方总文档
ubuntu官方总文档

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn