Elasticsearch Ping报错:NodeConfig缺少必填参数scheme
Elasticsearch连接报错:TypeError: NodeConfig.init() missing 1 required positional argument: 'scheme'
我尝试运行以下代码连接Elasticsearch:
def connect (): es = None es = Elasticsearch([{'host': 'localhost', 'port': 9200}]) print(es.ping())
但出现如下错误:
/Users/USER/PycharmProjects/practical_week4_ex_1/venv/bin/python /Users/USER/PycharmProjects/practical_week4_ex_1/scratch.py Traceback (most recent call last): File "/Users/USER/PycharmProjects/practical_week4_ex_1/scratch.py", line 7, in <module> es = Elasticsearch([{'host': 'localhost', 'port': 9200}]) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/USER/PycharmProjects/practical_week4_ex_1/venv/lib/python3.11/site-packages/elasticsearch/_sync/client/__init__.py", line 333, in __init__ node_configs = client_node_configs( ^^^^^^^^^^^^^^^^^^^^ File "/Users/USER/PycharmProjects/practical_week4_ex_1/venv/lib/python3.11/site-packages/elasticsearch/_sync/client/utils.py", line 105, in client_node_configs node_configs = hosts_to_node_configs(hosts) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/USER/PycharmProjects/practical_week4_ex_1/venv/lib/python3.11/site-packages/elasticsearch/_sync/client/utils.py", line 154, in hosts_to_node_configs node_configs.append(host_mapping_to_node_config(host)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/USER/PycharmProjects/practical_week4_ex_1/venv/lib/python3.11/site-packages/elasticsearch/_sync/client/utils.py", line 221, in host_mapping_to_node_config return NodeConfig(**options) # type: ignore ^^^^^^^^^^^^^^^^^^^^^ TypeError: NodeConfig.__init__() missing 1 required positional argument: 'scheme' Process finished with exit code 1
问题原因
你使用的是Elasticsearch Python客户端8.x版本,该版本API做了兼容性变更,不再支持仅传入host和port的旧格式,必须明确指定通信协议的scheme(http或https)。
修复方案
有两种简洁的修复方式:
方式1:在host配置字典中添加scheme参数
from elasticsearch import Elasticsearch def connect(): es = None # 新增scheme字段,本地Elasticsearch默认使用http协议 es = Elasticsearch([{'host': 'localhost', 'port': 9200, 'scheme': 'http'}]) print(es.ping()) connect()
方式2:直接传入完整URL字符串(推荐)
这种写法更简洁直观,直接包含协议、主机和端口:
from elasticsearch import Elasticsearch def connect(): es = None es = Elasticsearch("http://localhost:9200") print(es.ping()) connect()
验证结果
如果本地Elasticsearch服务正常运行,修复后的代码会输出True,表示连接成功。
内容的提问来源于stack exchange,提问作者YousefMenesy
相关产品推荐
相关产品推荐

