Почему эластичная массовая вставка поиска использует разделитель \n вместо массива объектов json?

Вот пример массовой вставки, предоставленной эластичными документами поиска по адресу: https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html

POST _bulk
{ "index" : { "_index" : "test", "_type" : "type1", "_id" : "1" } }
{ "field1" : "value1" }
{ "delete" : { "_index" : "test", "_type" : "type1", "_id" : "2" } }
{ "create" : { "_index" : "test", "_type" : "type1", "_id" : "3" } }
{ "field1" : "value3" }
{ "update" : {"_id" : "1", "_type" : "type1", "_index" : "test"} }
{ "doc" : {"field2" : "value2"} }

Они отметили, что "поскольку в этом формате в качестве разделителей используются литералы \ n, пожалуйста, убедитесь, что действия и источники JSON напечатаны недостаточно".

Я хотел бы знать причину такого формата ввода и почему они не выбрали вместо этого массив объектов JSON.

Например что-то:

POST _bulk
    [{{ "index" : { "_index" : "test", "_type" : "type1", "_id" : "1" } }
    { "field1" : "value1" }},
    { "delete" : { "_index" : "test", "_type" : "type1", "_id" : "2" } }
    { "create" : { "_index" : "test", "_type" : "type1", "_id" : "3" } }
    { "field1" : "value3" }
    { "update" : {"_id" : "1", "_type" : "type1", "_index" : "test"} }
    { "doc" : {"field2" : "value2"} }]

Вышеприведенная структура не верна, но что-то в этом роде. Что-то общее, чего мне не хватает, в стандартах разработки REST API? Разделители вместо массива?

1 ответ

Решение

Это позволяет конечной точке Bulk обрабатывать тело одну / две строки за другой. Если бы это был массив JSON, ES должен был бы загрузить и проанализировать все тело JSON в памяти, чтобы извлечь один элемент массива за другим.

Зная, что объемное тело может быть довольно большим (например, сотни МБ), это была оптимизация, предотвращающая сбой вашего сервера ES при отправке огромных массовых запросов.

Другие вопросы по тегам