Массовый индекс документа из файла JSON в ElasticSearch

У меня есть sample.json как следующий:

{"id":921,"car_make":"Chevrolet","car_model":"Traverse","car_year":2009,"car_color":"Yellow","made_in":"Guinea-Bissau"},
{"id":922,"car_make":"Mitsubishi","car_model":"Eclipse","car_year":1996,"car_color":"Khaki","made_in":"Luxembourg"},
{"id":923,"car_make":"Ford","car_model":"Lightning","car_year":1994,"car_color":"Teal","made_in":"China"},
{"id":924,"car_make":"Mercedes-Benz","car_model":"Sprinter 2500","car_year":2012,"car_color":"Yellow","made_in":"Colombia"},
{"id":925,"car_make":"Nissan","car_model":"Maxima","car_year":2002,"car_color":"Yellow","made_in":"Kazakhstan"},
{"id":926,"car_make":"Chrysler","car_model":"Pacifica","car_year":2006,"car_color":"Crimson","made_in":"China"}

Какую команду я должен использовать для индексации каждой строки в ElasticSearch? До сих пор я попробовал следующее, и это не работает.

>> curl -XGET 'localhost:9200/car/car' -d @sample.json 
{"error":"Content-Type header [application/x-www-form-urlencoded] is not supported","status":406}

Также попробовал:

curl -XGET 'localhost:9200/car/inventory/_bulk' -H 'Content-Type: application/json' -d @sample.json 
{"_index":"car","_type":"inventory","_id":"_bulk","found":false}

1 ответ

Вы захотите использовать Bulk API.

Документация хорошо объясняет все, но остерегайтесь следующих вещей:

  • Ваш файл должен быть разделен символом Newline JSON (NDJSON), с application/x-ndjson указано как Content-Type. Это означает отсутствие запятых в конце.
  • В каждой записи будет 2 строки, строка "Action/Metadata", а затем строка исходного json
  • Ваш файл ДОЛЖЕН заканчиваться символом новой строки
  • При использовании curl обязательно используйте --data-binary поэтому символы новой строки сохраняются
  • Путь URL не нужно указывать индекс или тип, просто _bulk, но затем вы должны включить индекс и ввести строку метаданных для каждой записи. Если вы указываете индекс и вводите в URL, то метаданные не должны включать _index а также _type поля.

Если взять ваш пример, ваш файл будет выглядеть примерно так:

{ "index" : { "_index" : "car", "_type" : "car", "_id" : "921" } }
{"id":921,"car_make":"Chevrolet","car_model":"Traverse","car_year":2009,"car_color":"Yellow","made_in":"Guinea-Bissau"}
{ "index" : { "_index" : "car", "_type" : "car", "_id" : "922" } }
{"id":922,"car_make":"Mitsubishi","car_model":"Eclipse","car_year":1996,"car_color":"Khaki","made_in":"Luxembourg"}
{ "index" : { "_index" : "car", "_type" : "car", "_id" : "923" } }
{"id":923,"car_make":"Ford","car_model":"Lightning","car_year":1994,"car_color":"Teal","made_in":"China"}
{ "index" : { "_index" : "car", "_type" : "car", "_id" : "924" } }
{"id":924,"car_make":"Mercedes-Benz","car_model":"Sprinter 2500","car_year":2012,"car_color":"Yellow","made_in":"Colombia"}
{ "index" : { "_index" : "car", "_type" : "car", "_id" : "925" } }
{"id":925,"car_make":"Nissan","car_model":"Maxima","car_year":2002,"car_color":"Yellow","made_in":"Kazakhstan"}
{ "index" : { "_index" : "car", "_type" : "car", "_id" : "926" } }
{"id":926,"car_make":"Chrysler","car_model":"Pacifica","car_year":2006,"car_color":"Crimson","made_in":"China"}

Тогда, конечно, команда curl будет указывать Content-Type заголовок как application/x-ndjsonи выглядеть примерно так:

curl -XPOST -H "Content-Type: application/x-ndjson" localhost:9200/_bulk --data-binary @sample.json 
Другие вопросы по тегам