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

Python调用OpenSearch执行查询返回404报错问题求助

问题原因
  • 端口填错:报错里请求打在5601端口,这是OpenSearch Dashboards(可视化组件,对应原Kibana)的默认端口,不是OpenSearch引擎本身的服务端口。OpenSearch对外提供REST查询接口的默认端口是9200,请求发到Dashboards服务上找不到对应API路径,直接返回404。
  • 客户端参数拼写错误:初始化客户端时写的httP_compress参数P大写,正确参数名是http_compress,拼写错误会导致压缩配置不生效,部分版本客户端还会直接抛参数异常。
  • SSL配置互斥:代码里设置use_ssl=False(走HTTP协议不启用SSL),同时开了verify_certs=True(校验SSL证书),两个配置逻辑冲突,非HTTPS场景下证书校验配置无意义,还可能触发连接报错。
  • 响应解析逻辑错误:你用的wr.opensearch.search是AWS Wrangler封装的方法,默认返回结构化结果(pandas DataFrame或者字典对象),不是JSON字符串,不需要再调用json.loads()做二次解析,强行调用反而会抛类型错误。
  • 代码细节问题:鉴权信息用了('pass','pass')占位值,变量名os和Python标准库os模块重名,容易引发非预期异常。
修复方案
  1. 调用查询方法时,端口参数传入OpenSearch引擎的服务端口(默认9200,如果你自己改了端口就填实际的引擎端口,不要填5601)
  2. 修正客户端初始化的参数拼写,调整互斥的SSL配置
  3. 去掉多余的json.loads()解析逻辑,替换占位鉴权信息,修正重名变量
  4. 调用前先本地验证端口连通性,确保索引存在

修复后的可运行代码如下:

from opensearchpy import OpenSearch, RequestsHttpConnection
import awswrangler as wr
from ssl import SSLError

def create_open_search_session(host, port):
    # 替换为实际的OpenSearch账号密码
    auth = ('your_opensearch_account', 'your_opensearch_password')
    client = OpenSearch(
        hosts=[{'host': host, 'port': port}],
        http_compress = True, # 修正参数拼写
        http_auth=auth,
        use_ssl=False,
        ssl_assert_hostname=False,
        ssl_show_warn=False,
        verify_certs=False, # 非SSL场景下关闭证书校验,若开HTTPS则同步把use_ssl改为True
        connection_class=RequestsHttpConnection,
    )
    return client

def get_severity(host, port):
    try:
        query = {
            "query": {
                "match": {
                    "car_make": "toyota"
                }
            }
        }
        os_client = create_open_search_session(host, port)
        # 端口必须传OpenSearch引擎端口,不要传5601
        data = wr.opensearch.search(
            client=os_client, 
            index="cars", 
            search_body=query,
            as_pandas=False # 设为False直接返回字典结构,默认True返回DataFrame
        )
        # 如果不想依赖awswrangler,也可以直接用opensearchpy原生方法查询:
        # data = os_client.search(index="cars", body=query)
        return data
    except SSLError as e:
        print("SSL error : ", e)

# 调用示例
# if __name__ == "__main__":
#     result = get_severity("192.168.14.180", 9200)
#     print(result)
验证注意事项
  • 运行代码前先在机器上执行curl http://<你的OpenSearch主机IP>:9200,能正常返回集群名称、版本号信息再跑代码,排除网络不通、服务没启动的问题
  • 确认cars索引已创建,且索引内存在car_make字段、有匹配toyota的文档,避免查询返回空结果
  • 如果集群开启了HTTPS,把use_ssl改为True,自签名证书场景保持verify_certs=False即可,正规CA签发的证书可以把verify_certs设为True开启校验

内容的提问来源于stack exchange,提问作者patel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 13:21:20