代码之家  ›  专栏  ›  技术社区  ›  user984003

AWS Elasticsearch:使用Python请求的批量插入

  •  0
  • user984003  · 技术社区  · 5 年前

    我有一个索引。这些是我的文件:

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

    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)
    

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

    错误的操作/元数据行[1],应为START\u对象,但找到[START\u ARRAY]

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

    编辑:

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

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

    批量请求必须用换行符终止[\n]

    但最后我还是换了句话。

    0 回复  |  直到 5 年前
        1
  •  0
  •   user984003    5 年前

    这样做有效:

    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)