使用Python Requests调用Elasticsearch查询报406错误求助
问题排查:Elasticsearch请求返回406错误(Content-Type不支持)
错误原因
你用requests.get(url, data=es_query)发起请求时,requests会自动将字典格式的es_query编码为application/x-www-form-urlencoded类型的表单数据,但Elasticsearch的_search接口仅接受application/json格式的请求体,因此返回406(不支持)错误。
对比你的curl命令,你明确指定了-H 'Content-Type: application/json'并传递JSON字符串,这和当前requests的调用逻辑完全不匹配。
解决方案
方法1:使用requests的json参数(推荐)
requests内置的json参数会自动将字典序列化为JSON字符串,同时自动设置Content-Type: application/json请求头,完全适配Elasticsearch的要求。修改后的代码:
import requests URL = "http://localhost:9200" INDEX = "users" url = f'{URL}/{INDEX}/_search/?pretty=true' # 可添加pretty参数,与原curl行为一致 es_query = { "from" : 0, "size" : 5, # 补上原curl中的分页参数,保证逻辑一致 "query" : { "query_string" : { "query" : "Port" } } } res = requests.get(url, json=es_query) print(res.json())
方法2:手动设置请求头并序列化JSON
如果需要手动控制请求细节,可以将字典转为JSON字符串,同时显式设置Content-Type请求头:
import requests import json URL = "http://localhost:9200" INDEX = "users" url = f'{URL}/{INDEX}/_search/?pretty=true' es_query = { "from" : 0, "size" : 5, "query" : { "query_string" : { "query" : "Port" } } } headers = {'Content-Type': 'application/json'} res = requests.get(url, data=json.dumps(es_query), headers=headers) print(res.json())
注意:你的Python代码漏掉了原curl中的
"from" : 0, "size" : 5分页参数,建议补上以保证查询逻辑完全一致。
内容的提问来源于stack exchange,提问作者Kiran S youtube channel
相关产品推荐
相关产品推荐

