如何使用Elasticsearch与Node.js加载(索引)含多条文档的JSON文件
Node.js Elasticsearch 批量导入千级JSON文档实现方案
你可以使用ES客户端的bulk批量操作接口完成需求,这是导入大量数据的最优方案,比单条循环插入性能高10倍以上。
前置准备
- 确保你的JSON文件是包含所有文档的数组结构,或是每行对应一条文档的JSON Lines格式
- 已经安装并初始化好官方
@elastic/elasticsearch客户端,客户端版本和你部署的ES服务版本保持匹配
实现步骤
- 读取本地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)
- 构造
bulk接口要求的请求格式:每两条内容对应一个文档操作,第一条声明操作类型、目标索引,第二条是文档本身
const operations = documents.flatMap(doc => [ { index: { _index: 'your-target-index' } }, // 替换为你的目标索引名 doc ])
- 执行批量导入,千级数据可单次提交无需拆分批次
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
相关产品推荐
相关产品推荐

