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模块重名,容易引发非预期异常。
修复方案
- 调用查询方法时,端口参数传入OpenSearch引擎的服务端口(默认9200,如果你自己改了端口就填实际的引擎端口,不要填5601)
- 修正客户端初始化的参数拼写,调整互斥的SSL配置
- 去掉多余的
json.loads()解析逻辑,替换占位鉴权信息,修正重名变量 - 调用前先本地验证端口连通性,确保索引存在
修复后的可运行代码如下:
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
相关产品推荐
相关产品推荐

