使用Python-elasticsearch-bulk批量快速向elasticsearch插入数据

本文介绍如何通过使用Elasticsearch的bulkAPI解决批量数据插入效率低的问题,利用Python的elasticsearch库实现从MySQL数据库读取数据并批量导入Elasticsearch的方法。

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

最近遇到一个批量向elasticsearch插入数据低效率的问题,在网上找到如下解决方案:

https://segmentfault.com/q/1010000005027014

对,就是使用elasticsearch内置的bulk API进行批量的插入操作。
同样,python elasticsearch lib也提供了bulk API的功能,因此便有如下代码:

from elasticsearch import Elasticsearch
from elasticsearch import helpers
import pymysql
import time

# 连接ES
es = Elasticsearch(
    ['127.0.0.1'],
    port=9200
)

# 连接MySQL
print("Connect to mysql...")
mysql_db = "test"
m_conn = pymysql.connect(host='127.0.0.1, port=3306, user='root', passwd='root', db=mysql_db, charset='utf8')
m_cursor = m_conn.cursor()

try:
    num_id = 0
    while True:
        s = time.time()
        # 查询数据
        sql = "select name,age,area from testTable LIMIT {}, 100000".format(num_id*100000)
        # 这里假设查询出来的结果为 张三 26 北京
        m_cursor.execute(sql)
        query_results = m_cursor.fetchall()

        if not query_results:
            print("MySQL查询结果为空 num_id=<{}>".format(num_id))
            break
        else:
            actions = []
            for line in query_results:
            # 拼接插入数据结构
                action = {
                    "_index": "company_base_info_2",
                    "_type": "company_info",
                    "_source": {
                        "name": line[0],
                        "age": line[1],
                        "area": line[2],
                    }
                }
				# 形成一个长度与查询结果数量相等的列表
                actions.append(action)
            # 批量插入
            a = helpers.bulk(es, actions)
            e = time.time()
            print("{} {}s".format(a, e-s))
        num_id += 1

finally:
    m_cursor.close()
    m_conn.close()
    print("MySQL connection close...")

代码的关键在于构造action结构,放入列表中,给helpers.bulk(es, actions)传参,调用方法真的是很简单了。

<think>好的,我现在需要回答用户的问题:“如何使用PythonElasticsearch插入数据”。首先,我应该回忆一下Elasticsearch的基本概念以及Python中常用的客户端库。 用户提到他们已经引用了Logstash作为数据处理组件,但这里的问题是关于Python直接插入数据。我记得Elasticsearch官方提供了Elasticsearch Python客户端库,可能就是这个。需要确认库的名称和用法。 接下来,用户可能希望得到一步步的指导,包括安装、连接、插入数据的示例代码。我需要确保步骤清晰,并且代码正确。可能需要分点说明:安装库、建立连接、插入数据的不同方法(如单条插入批量插入)。 同时,用户提供的引用中有提到使用Go实现Elasticsearch,但这里需要用Python,所以可能需要调整示例。另外,引用4提到KNN算法和retriever,但这个问题可能不相关,暂时忽略。 需要检查是否有需要注意事项,比如Elasticsearch的版本兼容性,或者是否需要处理异常。比如,确保客户端版本与Elasticsearch服务器版本匹配,否则可能出现兼容性问题。 另外,用户可能对数据格式有疑问,比如数据是否需要序列化为JSON,或者是否需要指定索引。在示例中应该明确展示如何创建索引(如果需要的话),或者直接插入到现有索引中。 可能还需要提到不同的插入方法,比如使用index()方法或者bulk()方法,以及它们各自的适用场景。例如,单条插入适合低频操作,而批量插入适合大量数据导入。 还要考虑错误处理,比如捕获连接异常或插入失败的情况,并在代码示例中展示如何处理这些异常,以增强鲁棒性。 最后,确保回答符合之前的系统级指令:使用正确的中文,数学公式格式正确(虽然这个问题可能不涉及数学公式),生成相关问题,并在引用处添加标识。根据用户提供的引用,引用[1]提到Logstash,引用[2]提到用Go实现,引用[3]提到连接项目的经验,引用[4]提到KNN和检索器。在回答中可能需要引用到这些内容,但当前问题主要关注Python插入数据,所以可能引用[1]和[3]中的相关内容,比如Logstash作为替代方案,或者提到Elasticsearch的扩展性。 现在整理步骤: 1. 安装elasticsearch库:pip install elasticsearch 2. 导入并连接Elasticsearch实例 3. 插入单条数据使用es.index()方法,指定索引和文档体 4. 批量插入使用helpers.bulk(),构造生成器提供数据 5. 处理可能出现的异常,如ConnectionError 6. 给出完整的代码示例,并解释参数 7. 生成相关问题 需要验证代码的正确性,比如确保index方法参数正确,文档体是字典格式。同时,helpers模块需要从elasticsearch导入。 另外,可能提到Logstash作为另一种数据导入工具,引用[1],让用户知道有其他选项。例如,在相关问题中提到Logstash的使用场景。 最后,生成的相关问题应该与插入数据相关,比如性能优化、批量处理、与Logstash的比较等。</think>要使用PythonElasticsearch插入数据,可以通过以下步骤实现: ### 步骤说明 1. **安装Python客户端库** 使用官方提供的`elasticsearch`库: ```bash pip install elasticsearch ``` 2. **建立连接** 导入库并连接到Elasticsearch实例(默认本地9200端口): ```python from elasticsearch import Elasticsearch es = Elasticsearch(["http://localhost:9200"]) ``` 3. **插入单条数据** 使用`index()`方法插入文档,需指定目标索引名和文档内容: ```python document = { "title": "PythonElasticsearch", "content": "本文演示如何通过Python操作ES", "timestamp": "2024-01-01" } response = es.index(index="articles", body=document) print(response["result"]) # 输出结果如"created" ``` 4. **批量插入数据** 使用`helpers.bulk()`提升效率,适合大规模数据: ```python from elasticsearch import helpers actions = [ {"_index": "articles", "_source": {"field1": "value1"}}, {"_index": "articles", "_source": {"field2": "value2"}} ] helpers.bulk(es, actions) ``` ### 关键参数说明 - `index`: 指定数据存储的索引(类似数据库表) - `body`: 文档内容(需为字典格式) - `id`: 可显式指定文档ID,若省略则自动生成 ### 异常处理 ```python try: es.index(index="articles", body=document) except elasticsearch.ConnectionError: print("连接Elasticsearch失败") ``` ### 完整代码示例 ```python from elasticsearch import Elasticsearch, helpers # 连接ES es = Elasticsearch(["http://localhost:9200"]) # 单条插入 doc = {"author": "张三", "text": "Elasticsearch实战"} es.index(index="test-index", id=1, body=doc) # 批量插入 actions = [ {"_index": "logs", "_source": {"level": "ERROR", "message": "File not found"}}, {"_index": "logs", "_source": {"level": "INFO", "message": "User login"}} ] helpers.bulk(es, actions) ``` 若需要更复杂的数据处理(如ETL),可结合Logstash实现高效传输[^1]。大规模数据场景下,Elasticsearch的扩展性优势显著[^3]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值