Elasticsearch Bulk请求体需按“操作元数据行+文档源数据行”交替拼接,每行独立JSON且以\n分隔;Java中用BufferedReader逐行读取CSV或NDJSON文件,结合Jackson序列化构造合法Bulk文本,批量发送并注意换行、转义与大小限制。

在 Java 中用 BufferedReader 读取文件(如 CSV、JSON 行格式)并构建 Elasticsearch 的 Bulk 请求体,核心是按 Bulk API 格式 拼接请求文本:每条操作指令(index/delete/update)占一行,紧接着是对应文档数据(也占一行),成对出现。
理解 Bulk 请求的文本结构
Bulk 请求体是纯文本,不是 JSON 数组。它由多行组成,交替为“操作元数据行”和“文档源数据行”。例如:
{"index":{"_index":"logs","_id":"1"}}
{"message":"hello","timestamp":"2024-01-01T00:00:00Z"}
{"index":{"_index":"logs"}}
{"message":"world","timestamp":"2024-01-01T00:00:01Z"}
注意:
- 每行必须是合法 JSON,且不能有逗号分隔;
- 元数据行不含换行或多余空格;
- 文档行内容需正确转义(如字符串中的双引号);
- 整个请求体结尾不加换行也可,但建议以换行结束。
用 BufferedReader 逐行解析并拼接 Bulk 文本
假设你读的是每行一个 JSON 文档(NDJSON 格式),可这样构建:
- 创建
StringBuilder存储批量请求体 - 用
BufferedReader逐行读取原始文档行 - 对每一行,生成对应的
index元数据行(含_index、可选_id) - 将元数据行 + 换行 + 原始文档行 + 换行 追加到
StringBuilder - 读满一定条数(如 1000 条)或到达 EOF 后,发送该段文本
示例代码片段(简化版):
StringBuilder bulkBody = new StringBuilder();
String line;
int count = 0;
int batchSize = 1000;
<p>while ((line = reader.readLine()) != null) {
// 构建 index 操作元数据(假设 index 名固定,无 _id)
bulkBody.append("{\"index\":{\"_index\":\"my-index\"}}\n");
bulkBody.append(line).append("\n"); // 原始 JSON 行
count++;</p><pre class="brush:java;toolbar:false;">if (count >= batchSize) {
sendToElasticsearch(bulkBody.toString());
bulkBody.setLength(0); // 清空复用
count = 0;
}
} // 发送剩余数据 if (count > 0) { sendToElasticsearch(bulkBody.toString()); }
处理 CSV 或其他非 JSON 格式时的转换
若源文件是 CSV,不能直接拼接。需先解析每行,再手动构造 JSON 字符串:
- 用
OpenCSV或Apache Commons CSV解析 CSV 行为字段数组 - 用
ObjectMapper(Jackson)将字段映射为 POJO,再序列化为 JSON 字符串 - 或手拼 JSON 字符串(注意转义双引号、反斜杠等)
- 再按上述方式插入到 Bulk 文本中
例如 CSV 行:123,"user A","2024-01-01"
对应 JSON 行:{"id":"123","name":"user A","date":"2024-01-01"}
注意事项与避坑点
- 换行符必须是 \n(Unix 风格),Windows 的 \r\n 可能导致解析失败
- 每行 JSON 必须独立完整,不能嵌套换行——否则 Bulk API 会报
illegal_argument_exception - 避免在文档 JSON 中手动拼接字符串;优先用 Jackson 等库序列化,防止转义错误
- 大文件下建议设置
BufferedReader的缓冲区大小(如new BufferedReader(reader, 8192))提升性能 - 发送前检查总字节数,Elasticsearch 默认单次 Bulk 请求上限为 100MB(可调)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











