You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 04:15:35