错误信息 The bulk request must be terminated by a newline 表示在使用 Elasticsearch 的 _bulk API 时,请求的格式不正确。_bulk API 要求每条数据记录以换行符 \n 结尾,这是必需的格式要求。


正确的 _bulk API 格式

1. 格式规则

  1. 每条命令和数据都需要单独一行:
    • 第一行:描述操作的元数据(如 createindexdeleteupdate)。
    • 第二行:具体的数据(JSON 格式)。
    • 每条数据记录后都需要一个换行符 \n
  2. 整个请求以一个额外的换行符结束:

正确示例

以下是一个包含两条记录的正确 _bulk 请求:

json
{ "index": { "_index": "my_index", "_id": "1" } } { "field1": "value1", "field2": "value2" } { "index": { "_index": "my_index", "_id": "2" } } { "field1": "value3", "field2": "value4" }

注意:

  • 每个命令和数据行后都有换行符 \n
  • 文件或请求的末尾也必须有一个换行符。

2. 常见错误原因

(1)缺少换行符

请求末尾没有额外的换行符,导致 Elasticsearch 无法解析整个请求。

(2)JSON 格式错误

某些情况下,JSON 数据没有正确地以换行符结尾。例如:

json
{ "index": { "_index": "my_index", "_id": "1" } }{ "field1": "value1" }

这会导致 _bulk API 请求失败。

(3)文件上传问题

如果使用文件作为请求体,文件中可能没有正确的换行符。


3. 示例修复

修复请求体格式

正确的 _bulk API 请求应该像这样:

bash
curl -X POST "http://localhost:9200/_bulk" -H "Content-Type: application/json" -d ' { "index": { "_index": "my_index", "_id": "1" } } { "field1": "value1", "field2": "value2" } { "index": { "_index": "my_index", "_id": "2" } } { "field1": "value3", "field2": "value4" } '
  • 最后一行的 \n 是必须的。

使用文件作为输入

如果从文件中读取数据发送 _bulk 请求,确保文件内容正确,并以换行符结束:

文件内容(bulk_data.json):

json
{ "index": { "_index": "my_index", "_id": "1" } } { "field1": "value1", "field2": "value2" } { "index": { "_index": "my_index", "_id": "2" } } { "field1": "value3", "field2": "value4" }

使用 curl 提交:

bash
curl -X POST "http://localhost:9200/_bulk" -H "Content-Type: application/json" --data-binary "@bulk_data.json"
  • --data-binary 确保文件的原始格式不被破坏。

4. 调试与验证

检查文件结尾

在 Linux 或 macOS 上,可以使用 cat -e 查看文件的换行符:

bash
cat -e bulk_data.json

输出示例:

ruby
{ "index": { "_index": "my_index", "_id": "1" } }$ { "field1": "value1", "field2": "value2" }$ { "index": { "_index": "my_index", "_id": "2" } }$ { "field1": "value3", "field2": "value4" }$ $
  • 每行后面的 $ 表示换行符。
  • 文件末尾必须有一个额外的 $

检查请求体

使用 curl 时,可以调试请求体是否符合规范:

bash
curl -X POST "http://localhost:9200/_bulk" -H "Content-Type: application/json" -v -d ' { "index": { "_index": "my_index", "_id": "1" } } { "field1": "value1", "field2": "value2" } '
  • 检查日志,确保请求体格式正确并包含必要的换行符。

5. 生成 _bulk 数据的工具

如果需要批量处理大量数据,可以使用以下工具生成 _bulk 格式的数据:

  1. Python 示例

    python
    with open("bulk_data.json", "w") as f: for i in range(1, 101): f.write(f'{{ "index": {{ "_index": "my_index", "_id": "{i}" }} }}\n') f.write(f'{{ "field1": "value{i}", "field2": "other_value{i}" }}\n')
  2. Logstash 配置: 使用 Logstash 将数据格式化为 _bulk 格式并直接导入 Elasticsearch。


6. 总结

  • _bulk 请求中的每条记录(命令和数据)都需要以换行符 \n 结束。
  • 请求体末尾必须有一个额外的换行符。
  • 使用 --data-binary 提交文件时,确保文件内容格式正确。
  • 通过调试工具(如 cat -e)或 Python 脚本生成正确的 _bulk 数据。

点赞(365) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部