首页 > 解决方案 > 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)

我得到的错误是非法参数异常:

格式错误的操作/元数据行 [1],应为 START_OBJECT,但找到了 [START_ARRAY]

我试过把它放在一个列表中并添加额外的换行符等。

编辑:

如果我发送 json 而不是数据:

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

那么错误是批量请求必须由换行符终止 [\n]

但我确实用换行符结束它。

标签: elasticsearchaws-elasticsearch

解决方案


这有效:

我的第一个字典的格式错误。我还更改了标题,但它似乎也可以与另一个标题一起使用。在 post 请求上发送数据,而不是 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)

推荐阅读