Elasticsearch:批量请求在 Elasticsearch 6.1.1 中引发错误

问题描述 投票:0回答:20

我最近升级到 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 中内联发送数据,效果很好。我尝试将换行符以及换行符添加到文件末尾。好像没啥用啊

json elasticsearch elasticsearch-5 bulk-load
20个回答
74
投票

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

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

26
投票

正如文件所说: 使用

--data-binary
标志而不是普通的
-d

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

我因为 JSON 格式而遇到这个问题。


8
投票

错误非常明显:

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

因此,您只需在

customers_full.json
文件末尾添加换行符即可。


7
投票

我遇到了同样的问题,花了几个小时添加和删除换行符,然后有人指出我错误地输入了文件名...所以请注意,如果文件实际上不存在,curl 会抛出相同的错误,这使得这非常令人困惑.


5
投票

我在使用 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"

仅此而已。

我希望这有帮助


4
投票

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

只需按 Enter 键即可创建一个空的新行!

瞧,问题解决了


4
投票

这对我有用:

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

3
投票

我只是忘记在文件名前添加一个

@
符号,如下所示

--data-binary "@products.json"

2
投票

您只需打开 json 文件,然后转到文件末尾(Ctrl+end),然后按 Enter 换行即可。


2
投票

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

我尝试了所有答案;他们都不起作用。我确信我的文件末尾有一个换行符。

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

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

最后有个好消息:


2
投票

在 JSON 文件中按 Enter 行尾并再次运行命令。

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

1
投票

我为此苦苦挣扎了一分钟。我的问题是由我的卷曲请求中

--data
-binary
之间的空格引起的,并给出了相同的错误 -
must end with new line [\\n]}

因此请仔细检查卷曲请求中的它是

--data-binary
而不是
--data - binary


1
投票

对我来说,问题只是由于文件名错误造成的。 我在命令中使用了 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" 

1
投票

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

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,如下所示,以确保我的记录应以换行符和回车符结尾。

然后,它对我有用:

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

更重要的是,如果您使用的是 Windows,文件结尾应该有一个回车符和换行符 (CRLF)。另外,如果 JSON 中的任何行包含 CR 但不包含 LF,那么您将得到解析异常

Source: org.elasticsearch.common.bytes.BytesReference$MarkSupportingStreamInputWrapper@2d5ed2ca

Windows CRLF and EOF


1
投票

您需要在卷曲请求中使用

--data-binary
而不是
-d
。请参阅:批量API


1
投票

当我使用

/Users/myName/file.json
时,问题会显示,但是当我使用
@/Users/myName/file.json
时,它会起作用。


0
投票

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

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

0
投票

如果您不使用数据文件,如何做到这一点?我遇到了问题,但无法从文件发送数据。

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);

0
投票

需要检查的一些事项:

  1. 文件以新行结束( ).
  2. 新行使用 Unix eol (LF),而不是 mac 或 windows eol。
  3. 在curl命令中指定文件名时,请确保在文件名前添加“@”。

0
投票
  • 我也面临着同样的问题,
  • 我通过在有效负载末尾添加新行来解决(就像在第 3 行中,我只是添加额外的行,
    \\n
  • 邮递员请求示例:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.