Массовый индекс документа из файла 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