python - 将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 循环中逐个进行,有没有办法批量执行此操作?因为这非常慢。
解决方案
有两种方法可以做到这一点。
- 使用 Elasticsearch Bulk API 和
requests
python - 使用内部调用相同批量 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)
推荐阅读
- php - symfony/encore @babel/preset-env 设置 corejs 的正确方法
- php - have_posts() while 循环忽略返回的任何 HTML
- python - databuffer += data_str TypeError:只能将str(不是“_io.TextIOWrapper”)连接到str
- ios - JSONDecoder 无法解码嵌套字典
- .net-core - 在 VS2017 中列出给定项目/.NET Core 项目解决方案的“递归依赖”的所有 nuget 包
- javascript - 如何让用户在 if 语句中输入有多个正确答案
- html - 使用两个同名但扩展名不同的html索引页面
- mysql - 调用特定列
- javascript - 在加载的 ajax 内容上绑定点击事件
- r - 在 R 中运行循环时在粘贴命令中包含索引