Elasticsearch:批量请求在 Elasticsearch 6.1.1 中抛出错误

Elasticsearch: Bulk request throws error in Elasticsearch 6.1.1

我最近升级到 Elasticsearch 版本 6.1.1,现在我无法从 JSON 文件中批量索引文档。当我在线执行时,它工作正常。以下是文件内容:

{"index" : {}}
{"name": "Carlson Barnes", "age": 34}
{"index":{}}
{"name": "Sheppard Stein","age": 39}
{"index":{}}
{"name": "Nixon Singleton","age": 36}
{"index":{}}
{"name": "Sharron Sosa","age": 33}
{"index":{}}
{"name": "Kendra Cabrera","age": 24}
{"index":{}}
{"name": "Young Robinson","age": 20}

当我运行这个命令时,

curl -XPUT 'localhost:9200/subscribers/ppl/_bulk?pretty' -H 'Content-Type: application/json' -d @customers_full.json

我收到这个错误:

"error" : {
    "root_cause" : [
      {
        "type" : "illegal_argument_exception",
        "reason" : "The bulk request must be terminated by a newline [\n]"
      }
    ],
    "type" : "illegal_argument_exception",
    "reason" : "The bulk request must be terminated by a newline [\n]"
  },
  "status" : 400

如果我在 Elasticsearch 5.x 中发送内联数据,它工作正常。我尝试在文件末尾添加换行符和换行符。好像不行。

错误很明显:

The bulk request must be terminated by a newline [\n]

所以您只需在 customers_full.json 文件末尾添加一个换行符就可以了。

你只需要打开json文件然后到文件末尾(Ctrl+end)然后回车换行即可。

您需要在 curl 请求中使用 --data-binary 而不是 -d。请参阅:Bulk API

在 JSON 文件末尾添加 行并保存文件,然后尝试 运行 下面的命令

curl -XPOST localhost:9200/subscribers/ppl/_bulk?pretty --data-binary @customers_full.json -H 'Content-Type: application/json'

我 运行 遇到了同样的问题,花了几个小时添加和删除换行符,直到有人指出我输入了错误的文件名...所以请注意,如果文件不是,curl 将抛出相同的错误实际存在,使这变得非常混乱。

正如文档所说: 使用 --data-binary 标志而不是普通的 -d

-d 不保留换行符 并且 不格式化 json.

我遇到这个问题是因为 JSON 格式化

在 JSON 文件中的行尾按 Enter 键,然后再次 运行 命令。

curl -H "Content-Type: application/x-ndjson" -XPOST 'localhost:9200/customers/personal/_bulk?pretty&refresh' --data-binary @"generated.json"

这在我的本地设置中有效。

curl -H "Content-type:application/json" -XPOST "http://localhost:9200/customer/personal/_bulk?pretty" --data-binary @"generated.json"

对于任何使用 postman 向 ElasticSearch 发出请求的人

Just press enter to create an empty new line!

瞧,问题解决了

这对我有用:

curl -H "Content-Type: application/x-ndjson" -XPOST "localhost:9200/bank/_bulk?pretty&refresh" --data-binary "@C:\Program Files\Elastic\Elasticsearch.2.0\accounts.json"

我在使用 Elasticsearch 7.3.

时遇到了类似的问题

我是这样解决的。

  1. 找到 .json 文件,比如 products.json 文件。
  2. 双击以在文本编辑器中打开 .json 文件。
  3. 滚动到 .json 文件的末尾,然后按键盘上的 ENTER 键。
  4. 关闭 .json 文件。这将在 .json 文件的末尾创建一个新行。
  5. 返回您的终端并运行下面的命令。

N/B:对于下面的命令,.json 文件名为 products.json,我正在将其导入到 http://localhost:9200/ecommerce/product

curl -H "Content-type: application/json" -XPOST "http://localhost:9200/ecommerce/product/_bulk?pretty" --data-binary "@products.json"

就这些了。

希望对您有所帮助

我在 Windows 10 上遇到了同样的问题 运行,使用的是 ElasticSearch 7.5.1。

我试过所有的答案; none 他们成功了。我确信我的文件末尾有一个换行符。

为了让它工作,我必须确保我上传的文件使用的是 UNIX 行尾字符(仅 0A,没有 0D),并且编码必须是 UTF-8。

使用Notepad++,您可以编辑文件的元数据。

终于有好消息了:

对我来说,问题只是因为文件名错误。 我在命令中使用了 customer_full.json,而文件在我的文件系统中被命名为 customer_full(没有扩展名)。

所以在我的例子中,这个命令对我有用:

curl -H "Content-Type: application/x-ndjson" -XPOST 'http://localhost:9200/customers/personal/_bulk?pretty&refresh' --data-binary @"customer_full" 

我只是忘记在这样的文件名前添加一个 @ 符号

--data-binary "@products.json"

我在 windows 使用 elastic 7.9.1 时遇到了类似的问题当我使用下面的 CURL 命令时。

curl -s -H "Content-Type: application/json" -XPOST localhost:9200/accounts/docs/_bulk?filter_path=items.*.error --data-binary  "@textoutES.json"  >> erroredAtES.json"

我尝试在文件末尾手动添加换行符,但没有成功。

我通过从 MySQL 数据库中提取数据来创建我的 JSON,如下所示,以确保我的记录应以 LINE FEED 和 CARRIAGE RETURN.

结尾

然后,它对我有用:

SELECT CONCAT('{"index":{"_id":"',id,'"}}\r\n',request_data,'\r\n') reqestData FROM cards 

更重要的是,如果您使用 windows,您 End-of-File 应该有一个 carriage-return 和 Line-Feed (CRLF)。此外,如果 JSON 中的任何行包含 CR 但没有 LF,那么您将得到解析异常 Source: org.elasticsearch.common.bytes.BytesReference$MarkSupportingStreamInputWrapper@2d5ed2ca

Windows CRLF and EOF

我为此苦苦挣扎了一会儿。我的是由 --data-binary 之间的 curl 请求中的 space 引起的,并给出了相同的错误 - must end with new line [\n]}.

所以 double-check 在 curl 请求中它是 --data-binary 而不是 --data - binary

如果您不使用数据文件,该怎么做?我遇到了问题,但没有从文件发送数据。

const data1 = {
    "amount" : "100",
    "@timestamp" : `${UTC_timestamp}`,
    "transaction_attributes" : {
    "channel" : "channel-foobarbaz",
    "session_id" : "session-1234",
    "information" : "iinformation-foobarbaznformation-foobarbaz"
    },
    "currency" : {
    "currency_description" : "my currency description",
    },
    "external_timestamp" : "2021-12-03T11:22:55.206229500Z" };

  
// execute a post
let res = http.post(url,JSON.stringify(data1),params);