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.
时遇到了类似的问题
我是这样解决的。
- 找到
.json
文件,比如 products.json
文件。
- 双击以在文本编辑器中打开
.json
文件。
- 滚动到
.json
文件的末尾,然后按键盘上的 ENTER 键。
- 关闭
.json
文件。这将在 .json
文件的末尾创建一个新行。
- 返回您的终端并运行下面的命令。
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);
我最近升级到 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.
时遇到了类似的问题我是这样解决的。
- 找到
.json
文件,比如products.json
文件。 - 双击以在文本编辑器中打开
.json
文件。 - 滚动到
.json
文件的末尾,然后按键盘上的 ENTER 键。 - 关闭
.json
文件。这将在.json
文件的末尾创建一个新行。 - 返回您的终端并运行下面的命令。
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);