Python对Elasticsearch的自动批量请求不起作用”;必须以换行符“结尾”;
我正试图通过Python自动化Elasticsearch的批量请求 因此,我正在为请求主体准备以下数据(以单独的行保存在列表中): 资料= [{“索引”:{u id:id}, {“tag”:{“input”:[tag],“weight”:count}] 然后我将使用请求执行Api调用: r=requests.put(端点,json=data,auth=auth) 这给了我一个错误: b'{“错误”:{“根本原因”:[{“类型”:“非法参数”\u异常”,“原因”:“批量请求必须通过换行符[\\n]”}]终止”,“类型”:“非法参数”\u异常”,“原因”:“批量请求必须通过换行符[\\n]”},状态:400}” 我知道我需要在请求的末尾换行,这就是我的问题所在: 如何在给定的数据结构中添加换行符?我试图在列表末尾添加“\n”,但没有成功Python对Elasticsearch的自动批量请求不起作用”;必须以换行符“结尾”;,python,json,list,elasticsearch,python-requests,Python,Json,List,elasticsearch,Python Requests,我正试图通过Python自动化Elasticsearch的批量请求 因此,我正在为请求主体准备以下数据(以单独的行保存在列表中): 资料= [{“索引”:{u id:id}, {“tag”:{“input”:[tag],“weight”:count}] 然后我将使用请求执行Api调用: r=requests.put(端点,json=data,auth=auth) 这给了我一个错误: b'{“错误”:{“根本原因”:[{“类型”:“非法参数”\u异常”,“原因”:“批量请求必须通过换行符[\\n]
谢谢你们 有效负载的内容类型必须是
ndjson
,并且index
属性需要包含名称。下面是一个工作片段:
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())
S.:您可能想在官方PY客户端中考虑这个问题。
降低一个级别,尝试从命令行中获得代码> CURL< /CODE> >端点。看看这是否能解决您的问题,当它起作用时,您可以尝试调整您的python代码。谢谢您的回复!我已经从邮递员向同一个端点发出了批量请求,这非常有效!确保API调用与put
与post
完全相同,标题、身份验证、数据……完全相同。我还对端点执行了一些请求(Get和Post),这些请求工作得非常好。使用Postman捕获API请求,您会发现它们并不完全相同。如果是的话,你不会在使用Python时出错,也不会在没有Python时出错。这个解决方案非常有效,非常感谢!尽管如此,我也尝试了它,但没有为索引属性添加名称,而且它也起了作用。这样做有什么缺点吗?没问题!当您没有在\u bulk
路径中指定它时,它是必需的——否则ES将不知道将文档放在哪里(没有双关语)。我认为它对您有效,因为您确实在端点中指定了它。更多信息请点击此处: