首页 > 解决方案 > 将avro文件批量索引到elasticsearch

问题描述

我写了这个简短的简单脚本

from elasticsearch import Elasticsearch
from fastavro import reader

es = Elasticsearch(['someIP:somePort'])
with open('data.avro', 'rb') as fo:
    avro_reader = reader(fo)
    for record in avro_reader:
        es.index(index="my_index", body=record)

它工作得很好。每条记录都是一个 json,Elasticsearch 可以索引 json 文件。但是,与其在 for 循环中逐个进行,有没有办法批量执行此操作?因为这非常慢。

标签: pythonelasticsearchavro

解决方案


有两种方法可以做到这一点。

  1. 使用 Elasticsearch Bulk API 和requestspython
  2. 使用内部调用相同批量 API 的 Elasticsearch python 库
    from elasticsearch import Elasticsearch
    from elasticsearch import helpers
    from fastavro import reader
    
    es = Elasticsearch(['someIP:somePort'])
    
    with open('data.avro', 'rb') as fo:
        avro_reader = reader(fo)
        records = [
            {
                "_index": "my_index",
                "_type": "record",
                "_id": j,
                "_source": record
            }
            for j,record in enumerate(avro_reader)
            ]
        helpers.bulk(es, records)

推荐阅读