Elasticsearch: массовый запрос вызывает ошибку в 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. Я попытался добавить новые строки, а также символ новой строки в конец файла. Кажется, не работает.


person Judy T Raj    schedule 02.02.2018    source источник


Ответы (16)


Добавьте пустую строку в конец файла JSON и сохраните файл, а затем попробуйте выполнить приведенную ниже команду.

curl -XPOST localhost:9200/subscribers/ppl/_bulk?pretty --data-binary @customers_full.json -H 'Content-Type: application/json'
person Sathishkumar Rakkiasamy    schedule 16.03.2018
comment
это было так просто, я пытался добавить новый строковый символ к самой команде: | ..где здесь четко сказано, что «запрос должен заканчиваться новой строкой» (y) - person Vikash; 25.03.2019
comment
Я добавил новую строку, но проблема все еще отображается - person TheEhsanSarshar; 28.09.2020
comment
Это сработало, когда я добавил новую строку к json + использовал параметр --data-binary вместо -d или --data. Добавление новой строки само по себе не помогает. - person maximus; 05.10.2020

Как говорится в документе: используйте флаг --data-binary вместо простого -d

-d не сохраняет символы новой строки и не форматирует json.

Я столкнулся с этой проблемой из-за форматирования JSON.

person Android14    schedule 01.06.2018
comment
За этот ответ ДЕЙСТВИТЕЛЬНО нужно проголосовать, чтобы он занял первое место. --data-binary действительно отличается от -d даже на Mac. Я думал, что двоичный режим имеет значение ТОЛЬКО для платформы Windows! - person pktCoder; 02.03.2019

Ошибка довольно ясна:

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

Так что вам просто нужно добавить новую строку в конец вашего customers_full.json файла, и все будет в порядке.

person Val    schedule 02.02.2018
comment
Я это сделал. Я добавил новую строку. Я попытался добавить символ новой строки, но все равно не работает. - person Judy T Raj; 02.02.2018
comment
Я пробовал то же самое против ES 6.1.3, и он отлично работал - person Val; 02.02.2018
comment
Вместо -d вы должны попробовать использовать --data-binary - person Val; 02.02.2018
comment
Это что-то вроде этого gist.github.com/Katniss394/f5b44ae76df85246118f86e030e - person Judy T Raj; 28.02.2018
comment
ну, почему-то явная новая строка отсутствует в конце вашего файла, мы должны увидеть полную пустую строку в качестве последней строки вашего документа - person Val; 28.02.2018

Я столкнулся с той же проблемой и потратил часы, добавляя и удаляя символы новой строки, прежде чем кто-то указал, что я неправильно набрал имя файла ... Так что обратите внимание, что curl выдаст ту же ошибку, если файл на самом деле отсутствует, что делает это очень запутанным.

person Raya Fratkina    schedule 30.05.2018

У меня была аналогичная проблема при работе с 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"

Это все.

Надеюсь, это поможет

person Promise Preston    schedule 23.09.2019

Для тех, кто использует почтальона для отправки запросов в ElasticSearch

Просто нажмите Enter, чтобы создать новую пустую строку!

И вуаля, проблема решена

person bnahayo    schedule 15.04.2019

Нажмите Enter в конце строки внутри файла JSON и снова запустите команду.

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

вам просто нужно открыть файл json, а затем перейти к концу файла (Ctrl + end), а затем, пожалуйста, Enter, чтобы разорвать новую строку.

person user6589750    schedule 07.02.2018

Это сработало для меня:

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"
person Rajat Goel    schedule 10.07.2019

У меня была такая же проблема с Windows 10, используя ElasticSearch 7.5.1.

Я перепробовал все ответы; ни один из них не работал. Я был уверен, что в конце моего файла стоит новая строка.

Чтобы заставить его работать, мне нужно было убедиться, что в загружаемом файле используются символы конца строки UNIX (только 0A, без 0D), а также кодировка должна быть UTF-8.

Массовый сбой ElasticSearch

Используя Notepad ++, вы можете редактировать метаданные файла.

Обновить EOL

Обновить кодировку

Напоследок хорошие новости:

введите здесь описание изображения

person Vince I    schedule 17.01.2020

Я боролся с этим горячую минуту. Мой был вызван пробелом в моем запросе на завиток между --data и -binary и дал ту же ошибку - must end with new line [\\n]}.

Так что еще раз проверьте, что в curl req это --data-binary, а не --data - binary

person Brian Loveless    schedule 15.10.2020

Для меня проблема была связана только с неправильным именем файла. Я использовал в команде 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" 
person Shubham Paldewar    schedule 08.02.2020

Я столкнулся с аналогичной проблемой в окнах, использующих эластичный 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"

Я попытался вручную добавить новую строку в конец файла, но это не сработало.

Я создал свой JSON путем извлечения данных из базы данных MySQL, как показано ниже, чтобы убедиться, что мои записи должны заканчиваться LINE FEED и CARRIAGE RETURN.

Тогда это работает для меня:

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

Что еще более важно, у вас в конце файла должны быть символы возврата каретки и перевода строки (CRLF), если вы используете окна. Также, если какая-либо строка в JSON содержит CR, но не LF, вы получите исключение синтаксического анализа Source: org.elasticsearch.common.bytes.BytesReference$MarkSupportingStreamInputWrapper@2d5ed2ca

Windows CRLF и EOF

person Sudhakar Polukonda    schedule 30.09.2020

Вам нужно использовать --data-binary вместо -d в вашем запросе на завивание. См. Bulk API.

person Karim    schedule 16.03.2018

Это сработало в моей локальной установке.

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

Я просто забываю символы добавления и @ перед таким именем файла

--data-binary "@products.json"
person TheEhsanSarshar    schedule 28.09.2020