AWS Elasticsearch: массовая вставка с использованием запросов Python

У меня есть индекс пользователей. Это мои документы:

doc1 = {"user_id":1, "name":"first1 last1"}
doc2 = {"user_id":2, "name":"first2 last2"}

Я пытаюсь выполнить массовую вставку с помощью запросов Python

data_as_str = ""
data_as_str += json.dumps({ "_index": "users"}) + "\n"
data_as_str += json.dumps(doc1) + "\n"
data_as_str += json.dumps({ "_index": "users"}) + "\n"
data_as_str += json.dumps(doc2) + "\n"

headers = {'Content-type': 'application/json', 'Accept': 'text/plain'}

r = requests.post("https://ES_HOST/_bulk", auth=awsauth, headers=headers, data=data_as_str)

Я получаю ошибку invalid_argument_exception:

Неверный формат строки действия / метаданных [1], ожидается START_OBJECT, но найдено [START_ARRAY]

Я пробовал поместить его в список и добавить дополнительные строки и т. Д.

РЕДАКТИРОВАТЬ:

Если я отправлю json вместо данных:

r = requests.post(bulkurl, auth=awsauth, headers=headers, json=data_as_str)

тогда возникает ошибка массовый запрос должен завершаться новой строкой [\ n]

Но я заканчиваю это новой строкой.


person user984003    schedule 11.12.2020    source источник


Ответы (1)


Это работает:

У меня был неправильный формат первого дикта. Я также изменил заголовок, но, похоже, он работает и с другим. Отправляйте данные, а не json в почтовом запросе.

data_as_str = ""
data_as_str += json.dumps({"index": {"_index": "users","_id":1}}) + "\n"
data_as_str += json.dumps(doc1) + "\n"
data_as_str += json.dumps({"index": {"_index": "users","_id":2}}) + "\n"
data_as_str += json.dumps(doc2) + "\n"

headers = {'Content-Type': 'application/x-ndjson'}

r = requests.post("https://ES_HOST/_bulk", auth=awsauth, headers=headers, data=data_as_str)
person user984003    schedule 11.12.2020