当前位置: 首页 > news >正文

使用 Node.js Elasticsearch 客户端索引大型 CSV 文件

作者:来自 Elastic joshmock

使用 bulk API 可以轻松地将大量文档索引到 Elasticsearch:将你的数据记录转换为 JSON 文档,并插入指示它们应该添加到哪个索引的指令,然后将这个大的换行分隔 JSON blob 作为请求体,通过单个 HTTP 请求发送到 Elasticsearch 集群。或者,使用 Node.js 客户端的 bulk 函数。

更多阅读:Elasticsearch:使用最新的 Nodejs client 8.x 来创建索引并搜索

下面演示如何读取 CSV 文件,将其行转换为 JSON 对象,并进行索引:

import { Client } from '@elastic/elasticsearch' import { parse } from "csv-parse/sync" import { readFileSync } from 'node:fs' const csv = parse(readFileSync('data.csv', 'utf8'), { columns: true }) const operations = csv.flatMap(row => [ { index: { _index: "my_index" } }, row ]) const client = new Client({ node: 'http://localhost:9200' }) await client.bulk({ operations })

但是,如果你需要发送的数据量超过 Elasticsearch 单次请求能接收的大小,或者你的 CSV 文件太大,无法一次性全部加载到内存中,该怎么办?这时可以使用 bulk helper!

虽然 bulk API 本身已经很简单,但对于更复杂的场景,helper 提供了对流式输入的支持,可以将大型数据集拆分为多个请求等。

例如,如果你的 Elasticsearch 服务器只能接收小于 10MB 的 HTTP 请求,你可以通过设置 flushBytes 值来指示 bulk helper 拆分数据。每当请求即将超过设置值时,就会发送一次 bulk 请求:

const csv = parse(readFileSync('data.csv', 'utf8'), { columns: true }) await client.helpers.bulk({ datasource: csv, onDocument(doc) { return { index: { _index: "my_index" } } }, // send a bulk request for every 9.5MB flushBytes: 9500000 })

或者,如果你的 CSV 文件太大无法一次性加载到内存中,helper 可以将流作为数据源,而不是使用数组:

import { createReadStream } from 'node:fs' import { parse } from 'csv-parse' const parser = parse({ columns: true }) await client.helpers.bulk({ datasource: createReadStream('data.csv').pipe(parser), onDocument(doc) { return { index: { _index: "my_index" } } } })

这会将 CSV 文件中的行缓冲到内存中,解析为 JSON 对象,并让 helper 将结果刷新为一个或多个 HTTP 请求发送出去。这个解决方案不仅节省内存,而且阅读起来也和将整个文件加载到内存中的方法一样简单!

原文:https://discuss.elastic.co/t/dec-9th-2025-en-use-the-node-js-elasticsearch-client-to-index-large-csv-files/382901

http://www.jsqmd.com/news/114374/

相关文章:

  • 【紧急预警】Open-AutoGLM即将不支持主流推理引擎?官方未公开的迁移方案来了
  • 【紧急预警】Open-AutoGLM即将不支持主流推理引擎?官方未公开的迁移方案来了
  • 2025年热门的原装进口氯化氢传感器/紫外原理氯化氢传感器热门厂家推荐榜单 - 品牌宣传支持者
  • Open-AutoGLM协议适配避坑手册(90%团队忽略的3个法律雷区)
  • Linly-Talker在街舞battle中的节奏感培养
  • 【工业级AI验证标准】:Open-AutoGLM结果精准度达99.9%的秘密
  • 为什么顶尖企业都在用Open-AutoGLM?深度解析其分布式控制架构
  • 2025 年 CTF 资源大全:靶场、工具、社区一站式导航
  • 2025年济南搬家公司联系方式汇总: 本地资深企业官方联系渠道一站式搬迁方案参考 - 十大品牌推荐
  • 红萝卜矮砧密植:水肥一体化系统的铺设要点
  • Open-AutoGLM编译速度翻倍:5个你必须掌握的底层优化策略
  • 智能体实战系列(二)|智能体「行动后反思」的自动化Demo
  • 【Open-AutoGLM深度拆解】:为什么顶尖团队都在用模块化架构?
  • 2025年316不锈钢合页排铰定制与源头工厂推荐,机箱合页排铰厂家专业解析 - 工业推荐榜
  • 收藏!35岁程序员转行大模型:从0到1的落地指南(附避坑攻略)
  • Linly-Talker在热气球观光中的景点介绍
  • 安全工具集:一站式密码生成、文件加密与二维码生成解决方案
  • 2025年知名的椰油基葡糖苷厂家最新权威实力榜 - 行业平台推荐
  • 2025年可靠的大连学习3D建模专业度榜 - 品牌宣传支持者
  • Open-AutoGLM插件内存泄漏频发?资深架构师亲授5步诊断与优化流程
  • vue3基于python的球类体育赛事发布和在线购票选座系统60576715
  • 为什么95%的Open-AutoGLM项目在国产化环境中失败?(深度兼容性剖析)
  • Linly-Talker在生日祝福视频中的亲友形象复刻
  • 运维做满 2 年必看!为啥越干越焦虑?转网络安全才是破局关键
  • vue基于Python遥感影像共享系统 _Pycharm django flask
  • 机器学习核心概念与主流算法(通俗详细版)
  • 新小白新电脑配置Java环境,含图详解,收藏这篇就够了
  • 2025年优秀的大连日本语言学校申请打工服务质量榜 - 品牌宣传支持者
  • 如何构建高可信验证体系?Open-AutoGLM落地必用的6个工具链
  • Python+Vue的酷听音乐/在线音乐试听网站 Pycharm django flask