我最近升级到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
如果我在内联和弹性搜索5.x中发送数据,它可以正常工作。我尝试在文件末尾添加换行符和换行符。似乎不起作用。
答案 0 :(得分:22)
在JSON文件的末尾添加空行并保存文件,然后尝试运行以下命令
curl -XPOST localhost:9200/subscribers/ppl/_bulk?pretty --data-binary @customers_full.json -H 'Content-Type: application/json'
我希望它适合你。
答案 1 :(得分:8)
正如文档所说:使用--data-binary标志而不是plain -d。后者不保留换行符和不格式化json 。 由于JSON格式化,我遇到了这个问题。
答案 2 :(得分:7)
错误很明显:
The bulk request must be terminated by a newline [\n]
因此,您只需在customers_full.json
文件的末尾添加换行符,即可。
答案 3 :(得分:2)
我遇到了同样的问题,并花了好几个小时添加和删除换行符,然后有人指出我错误输入了文件名...所以请注意,如果文件实际上不存在,curl将抛出相同的错误,使这个超级-confusing。
答案 4 :(得分:2)
使用 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"
仅此而已。
我希望这会有所帮助
答案 5 :(得分:1)
您需要在curl请求中使用--data-binary而不是-d。请参阅https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html
答案 6 :(得分:1)
适用于任何使用邮递员向ElasticSearch发出请求的人
只需按Enter即可创建一个空的新行!
瞧,问题解决了
答案 7 :(得分:1)
使用ElasticSearch 7.5.1在Windows 10上运行时,我遇到了同样的问题。
我尝试了所有答案;他们都没有工作。我确定文件末尾有换行符。
要使其正常工作,我必须确保上传的文件使用UNIX行尾字符(仅0A,没有0D),并且编码必须为UTF-8。
使用Notepad ++,您可以编辑文件的元数据。
最后一些好消息:
答案 8 :(得分:1)
对我来说,问题仅归因于文件名错误。 我在命令中使用了customer_full.json,其中文件在我的文件系统中命名为customer_full(无扩展名)。
所以在我的情况下: curl -H“内容类型:应用程序/ x-ndjson” -XPOST'http://localhost:9200/customers/personal/_bulk?pretty&refresh'--data-binary @“ customer_full”
命令对我有用。
答案 9 :(得分:1)
在CURL命令下使用弹性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,以确保我的记录应以LINE FEED和CARRIAGE RETURN结尾。
然后,它对我有用。
SELECT CONCAT('{"index":{"_id":"',id,'"}}\r\n',request_data,'\r\n') reqestData FROM cards
更重要的是,如果您使用的是Windows,则文件结尾应具有回车符和换行(CRLF)。另外,如果JSON中的任何行包含CR但不包含LF,那么您将获得解析异常“来源:org.elasticsearch.common.bytes.BytesReference$MarkSupportingStreamInputWrapper@2d5ed2ca”
答案 10 :(得分:1)
我为此忙了一会儿……我的是由于我的curl请求中--data和-binary之间的空格引起的,并给出了相同的错误-“必须以新行[\ n]结尾}“ ...
因此请仔细检查一下curl要求是否为-data-binary 而不是--data-binary
答案 11 :(得分:0)
你只需要打开json文件,然后转到文件的末尾(Ctrl + end),然后按Enter键打开一个新行。
答案 12 :(得分:0)
在json文件中按Enter键,然后再次运行命令。
curl -H“内容类型:application / x-ndjson” -XPOST'localhost:9200 / customers / personal / _bulk?pretty&refresh'--data-binary @“ generated.json”
答案 13 :(得分:0)
这在我的本地设置中有效。
curl -H“ Content-type:application / json” -XPOST“ http://localhost:9200/customer/personal/_bulk?pretty” --data-binary @“ generation.json”
答案 14 :(得分:0)
这对我有用:
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"
答案 15 :(得分:0)
我只是忘记了像这样的文件名之前的加号和@
符号
--data-binary "@products.json"