OpenSearch-py search方法设置timeout报错问题求助
解决OpenSearch-py搜索超时设置报错问题
问题场景
使用OpenSearch-py调用search接口时设置timeout=30,触发如下错误:
ValueError: Timeout value connect was 30.0, but it must be an int, float or None.
尝试过字符串"30"、"30s",数值30.0,甚至用int()/float()转换,均报相同错误,完整回溯:
Traceback (most recent call last): File "/usr/src/app/opensearchpy/connection/http_requests.py", line 179, in perform_request response = self.session.send(prepared_request, **send_kwargs) File "/usr/src/app/requests/sessions.py", line 618, in send r = adapter.send(request, **kwargs) File "/usr/src/app/requests/adapters.py", line 426, in send timeout = TimeoutSauce(connect=timeout, read=timeout) File "/usr/src/app/urllib3/util/timeout.py", line 94, in __init__ self._connect = self._validate_timeout(connect, 'connect') File "/usr/src/app/urllib3/util/timeout.py", line 135, in _validate_timeout raise ValueError("Timeout value %s was %s, but it must be an " ValueError: Timeout value connect was 30.0, but it must be an int, float or None.
问题原因
OpenSearch-py的search方法里的timeout参数是OpenSearch服务端的查询超时时间(支持"30s"这类字符串格式),但该参数会被错误传递给底层requests库作为连接超时时间。而requests/urllib3要求连接超时必须是纯数值类型,OpenSearch-py内部的参数转换逻辑导致传递时出现类型异常。
解决方案
方案1:初始化客户端时设置全局超时
不要在search方法中设置timeout,而是在初始化OpenSearch客户端时配置连接/读取超时:
from opensearchpy import OpenSearch # 初始化客户端时设置全局超时 client = OpenSearch( hosts=["http://localhost:9200"], http_compress=True, timeout=30, # 全局超时,单位秒 # 也可分别设置连接和读取超时 # timeout=(10, 30) # (连接超时, 读取超时) ) # 调用search时无需再传timeout参数 client.search( index=index, body=search_body, scroll=scroll, ignore=ignore, size=size )
方案2:请求级单独设置超时
如果需要给单个请求单独设置超时,使用request_timeout参数(这才是传递给requests的合法超时参数):
self.get_client().search( index=index, body=search_body, scroll=scroll, ignore=ignore, size=size, request_timeout=30 # 请求级别超时,对应requests的timeout参数 )
参数区别
timeout:OpenSearch服务端的查询超时,支持"30s"格式,不要与客户端超时混淆request_timeout:客户端(requests库)的超时,必须为数值类型,控制连接和读取的超时时间
内容的提问来源于stack exchange,提问作者Linora
相关产品推荐
相关产品推荐

