使用 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

相关推荐
爱喝雪碧的可乐25 分钟前
OpenAI Codex完成率
大数据·人工智能·1024程序员节
m0_6220235330 分钟前
产业资本运作:新金融博弈下的产业链安全底盘搭建
大数据·深度学习·重构·1024程序员节
微功夫信息技术1 小时前
非急救转运如何规范管理
大数据·交通物流
智能运维指南1 小时前
企业运维监控平台哪家好?2026年五大全栈可观测方案对比与选型推荐
大数据·运维·人工智能
数字新视界1 小时前
动环监控可视化在机房管理中的创新应用与发展趋势
大数据·物联网·信息可视化·信息与通信·一体化机柜
FII工业富联科技服务1 小时前
工业经验如何转化为AI Skills?详解知识调用、任务编排与多智能体协同
大数据·人工智能·架构·自动化·omniverse·柔性生产
CRMEB系统商城2 小时前
Redis + 消息队列 + 连接池:CRMEB PRO 性能优化的三驾马车
大数据·数据库·人工智能·小程序·php·1024程序员节
红海云3 小时前
两台DGX Spark部署DeepSeek的实战边界
大数据·分布式·spark
weixin_440401694 小时前
大数据技术-人工智能编程题
大数据·人工智能·python·1024程序员节
Elasticsearch4 小时前
5 分钟内将 56 页扫描文档转化为带引用的答案:面向搜索无法读取的文档的检索增强生成流水线
elasticsearch