Почему Elasticsearch Bulk-API использует заголовок «Content-Type: application / json»? - PullRequest
0 голосов
/ 04 февраля 2019

Мне просто интересно, почему ES использует этот заголовок, если тело запроса не json, а текст с несколькими строками, каждая из которых является json.Например:

{ "create" : { "_index" : "movies", "_type" : "movie", "_id" : "135569" } }
{ "id": "135569", "title" : "Star Trek Beyond", "year":2016 , "genre":["Action", "Adventure", "Sci-Fi"] }
{ "create" : { "_index" : "movies", "_type" : "movie", "_id" : "122886" } }
{ "id": "122886", "title" : "Star Wars: Episode VII - The Force Awakens", "year":2015 , "genre":["Action", "Adventure", "Fantasy", "Sci-Fi", "IMAX"] }
{ "create" : { "_index" : "movies", "_type" : "movie", "_id" : "109487" } }
{ "id": "109487", "title" : "Interstellar", "year":2014 , "genre":["Sci-Fi", "IMAX"] }
{ "create" : { "_index" : "movies", "_type" : "movie", "_id" : "58559" } }
{ "id": "58559", "title" : "Dark Knight, The", "year":2008 , "genre":["Action", "Crime", "Drama", "IMAX"] }
{ "create" : { "_index" : "movies", "_type" : "movie", "_id" : "1924" } }
{ "id": "1924", "title" : "Plan 9 from Outer Space", "year":1959 , "genre":["Horror", "Sci-Fi"] }

Это будет действительный запрос, несмотря на то, что он не является хорошо отформатированным json.В интерфейсах RESTful обычно определяют что-то как application / json, даже если это не так?Вы даже не можете отправить его из Почтальона, только из cURL, который не проверяет синтаксис тела.

1 Ответ

0 голосов
/ 05 февраля 2019

Технически, при вызове конечной точки _bulk заголовок типа контента должен быть application/x-ndjson, а не application/json , как указано в их документах

в последней строкеданных должен заканчиваться символом новой строки \ n.Каждому символу новой строки может предшествовать возврат каретки \ r.При отправке запросов в эту конечную точку заголовок Content-Type должен быть установлен на application / x-ndjson.

Причина, по которой это не массив JSON, заключается в том, что когда координирующий узел получает массовый запрос, онможно разделить его на несколько частей, просто взглянув на количество строк (то есть символов новой строки), и отправить каждый кусок на другой узел для обработки.Если бы контент представлял собой JSON, координирующий узел должен был бы проанализировать все это и для нескольких мегабайтных массовых запросов это отрицательно сказалось бы на производительности.

NDJSON - это удобный формат для хранения или потоковой передачи структурированных данных, которые могут обрабатываться по одной записи за раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...