I am trying to automate a bulk request for Elasticsearch via Python.
Therefore, i am preparing the data for the request body as follows (saved in a list as separate rows):
data = [{"index":{"_id": ID}}, {"tag": {"input": [tag], "weight":count}}]
Then i will use requests to do the Api call:
r = requests.put(endpoint, json = data, auth = auth)
This is giving me the Error: b'{"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"The bulk request must be terminated by a newline [\\n]"}],"type":"illegal_argument_exception","reason":"The bulk request must be terminated by a newline [\\n]"},"status":400}'
I know that i need to put a newline at the end of the request, and there lies my problem: How can i append a newline to that given data structure? I tried to append '\n' to my list at the end but that didnt work out.
Thank you guys!
The payload's content type must be ndjson and the index attribute needs be specified as well. Here's a working snippet:
import requests
import json
endpoint = 'http://localhost:9200/_bulk'
# vvvvvv
data = [{"index": {"_index": "123", "_id": 123}},
{"tag": {"input": ['tag'], "weight":10}}]
# vvv vvv
payload = '\n'.join([json.dumps(line) for line in data]) + '\n'
r = requests.put(endpoint,
# `data` instead of `json`!
data=payload,
headers={
# it's a requirement
'Content-Type': 'application/x-ndjson'
})
print(r.json())
P.S.: You may want to consider the bulk helper in the official py client.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With