Массовый запрос вызывает ошибку в поиске elastics 6.1.1

Недавно я обновился до версии 6.1.1 elasticsearch, и теперь я не могу массировать индексные документы из json файла. Wehn я делаю это inline, он отлично работает. Вот содержание документа:

{"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

Он отлично работает, если я отправляю данные inline и в elasticsearch 5.x. Я попытался добавить новые строки, а также символ новой строки в конец файла. Кажется, не работает.

Ответ 1

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

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

Надеюсь, это сработает для вас.

Ответ 2

Как говорится в документе:

используйте флаг --data-binary вместо обычного -d

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

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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

Ответ 7

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

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

Ответ 8

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

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

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

Ответ 9

У меня была похожая проблема при работе с Elasticsearch 7.3.

Вот как я это решил.

  1. Найдите файл .json, скажем, файл products.json.
  2. Дважды щелкните, чтобы открыть файл .json в текстовом редакторе.
  3. Прокрутите до конца файла .json и нажмите клавишу ВВОД на клавиатуре.
  4. Закройте файл .json. Это создаст новую строку в конце файла .json.
  5. Вернитесь к своему терминалу и выполните команду ниже.

Н/Б: Для приведенной ниже команды имя файла .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"

Это все.

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

Ответ 11

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

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"