You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Elasticsearch与Node.js加载(索引)含多条文档的JSON文件

Node.js Elasticsearch 批量导入千级JSON文档实现方案

你可以使用ES客户端的bulk批量操作接口完成需求,这是导入大量数据的最优方案,比单条循环插入性能高10倍以上。

前置准备

  • 确保你的JSON文件是包含所有文档的数组结构,或是每行对应一条文档的JSON Lines格式
  • 已经安装并初始化好官方@elastic/elasticsearch客户端,客户端版本和你部署的ES服务版本保持匹配

实现步骤

  1. 读取本地JSON文件、初始化客户端
const fs = require('fs/promises')
const { Client } = require('@elastic/elasticsearch')

// 初始化ES客户端
const client = new Client({
  node: 'http://localhost:9200' // 替换为你的ES服务地址
})

async function bulkImport() {
  // 读取JSON文件,此处假设你的JSON为文档数组结构
  const rawData = await fs.readFile('./your-documents.json', 'utf8')
  const documents = JSON.parse(rawData)
  1. 构造bulk接口要求的请求格式:每两条内容对应一个文档操作,第一条声明操作类型、目标索引,第二条是文档本身
const operations = documents.flatMap(doc => [
    { index: { _index: 'your-target-index' } }, // 替换为你的目标索引名
    doc
  ])
  1. 执行批量导入,千级数据可单次提交无需拆分批次
const bulkResponse = await client.bulk({
    refresh: true, // 导入完成后立即刷新索引,可直接查询到新数据
    operations
  })

  // 错误检查:筛选导入失败的文档
  if (bulkResponse.errors) {
    const erroredDocuments = []
    bulkResponse.items.forEach((action, i) => {
      const operation = Object.keys(action)[0]
      if (action[operation].error) {
        erroredDocuments.push({
          status: action[operation].status,
          error: action[operation].error,
          document: documents[i]
        })
      }
    })
    console.log('导入失败的文档列表:', erroredDocuments)
  } else {
    console.log(`成功导入${documents.length}条文档`)
  }
}

bulkImport().catch(console.error)

注意事项

  • 如果后续需要导入万级及以上数据,可按每1000-5000条拆分一个批次提交,避免单次请求体过大导致超时
  • 如果你的JSON文件是JSON Lines格式,可采用逐行读取的方式构造operations,避免大文件一次性加载占用过高内存
  • 如果需要自定义文档ID,可在index配置项中新增_id: doc.yourIdField字段即可

内容的提问来源于stack exchange,提问作者Drsaud

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 01:09:04