【问题标题】:Haystack's ElasticsearchDocumentStore() cannot connect running ElasticSearch containerHaystack 的 ElasticsearchDocumentStore() 无法连接正在运行的 ElasticSearch 容器
【发布时间】:2023-02-02 17:05:28
【问题描述】:

我正在使用 ElasticSearch 8.5.1 版和与 8.5.1 版并发的 ElasticSearch 的最新 python 库。另外,我的 Python 版本是 3.10.4。我试图关注这个tutorial,但显然某些软件在过去一年中发生了一些变化。

我在使用 Haystack 的 ElasticsearchDocumentStore 时遇到了问题。按照 ElasticSearch 说明here 使用 docker 镜像在容器中部署单个节点的实例后,我能够成功运行以下 2 个代码块:


    import requests
    from datetime import datetime
    from elasticsearch import Elasticsearch
    from elasticsearch import RequestsHttpConnection
    
    client = Elasticsearch( [{ 'host': '127.0.0.1', 'port': 9200,'scheme': 'https'}], 
    ca_certs="../http_ca.crt", http_auth=('username', 'password'))
    resp = client.info()
    resp  # this executed correctly

这只是为了很好的衡量标准:

    r = requests.get('https://localhost:9200/_cluster/health', verify="../http_ca.crt", 
    headers={"Authorization": 'Basic ' + TOKEN})
    r.json()  # this executed correctly

然后我试了

    from haystack.document_stores.elasticsearch import ElasticsearchDocumentStore

    doc_store = ElasticsearchDocumentStore(
        host="localhost",
        port=9200,
        scheme="https",
        username = "username",
        password = "password",
        index = "doc1",

)

无论我在上面尝试什么,我都会收到此错误:

输出超出大小 限制。 在文本中打开完整的输出数据 编辑 警告:弹性搜索:获取 https://localhost:9200/ [状态:N/A request:0.029s] Traceback(最近一次调用):文件 "c:\Users\k.mufti\Desktop\QA_system.venv\lib\site-packages\urllib3\connectionpool.py", 第 703 行,在 urlopen 中 httplib_response = self._make_request( 文件 "c:\Users\k.mufti\Desktop\QA_system.venv\lib\site-packages\urllib3\connectionpool.py", 第 386 行,在 _make_request self._validate_conn(conn) 文件“c:\Users\k.mufti\Desktop\QA_system.venv\lib\site-packages\urllib3\connectionpool.py”, 第 1042 行,在验证连接 conn.connect() 文件“c:\Users\k.mufti\Desktop\QA_system.venv\lib\site-packages\urllib3\connection.py”, 第 414 行,连接中 self.sock = ssl_wrap_socket( 文件 "c:\Users\k.mufti\Desktop\QA_system.venv\lib\site-packages\urllib3\util\ssl.py", 第 449 行,在 ssl_wrap_socket 中 ssl_sock =ssl_wrap_socket_impl(文件“c:\Users\k.mufti\Desktop\QA_system.venv\lib\site-packages\urllib3\util\ssl.py", 第 493 行,在 _ssl_wrap_socket_impl 返回 ssl_context.wrap_socket(sock, server_hostname=server_hostname) 文件“C:\Python310\lib\ssl.py”, 第 512 行,在 wrap_socket 中 返回 self.sslsocket_class._create( 文件“C:\Python310\lib\ssl.py”,第 1070 行,在 _create self.do_handshake() 文件“C:\Python310\lib\ssl.py”,第 1341 行,在 do_handshake 中 self._sslobj.do_handshake() ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败:自签名 证书链中的证书 (_ssl.c:997)

在处理上述异常的过程中,又出现了一个异常:

回溯(最后一次通话): ... self.do_handshake() 文件“C:\Python310\lib\ssl.py”,第 1341 行,在 do_handshake 中 self._sslobj.do_handshake() urllib3.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败:证书链中的自签名证书 (_ssl.c:997) 输出超出大小限制。在文本编辑器中打开完整的输出数据

ConnectionError Traceback(最后一次调用) 文件 c:\Users\k.mufti\Desktop\QA_system.venv\lib\site-packages\haystack\document_stores\elasticsearch.py​​:272,在 ElasticsearchDocumentStore._init_elastic_client(cls, host, port, username, password, api_key_id, api_key , aws4auth, scheme, ca_certs, verify_certs, timeout, use_system_proxy) 271 如果不是状态: --> 272 引发连接错误( 273 f“与 Elasticsearch 的初始连接失败。确保运行 Elasticsearch 实例” 274 f"at {hosts} 并且它已经完成初始加速(可能需要 > 30 秒)。" 275) 276 除了异常:

ConnectionError:与 Elasticsearch 的初始连接失败。确保您在 [{'host': 'localhost', 'port': 9200}] 运行 Elasticsearch 实例,并且它已完成初始启动(可能需要 > 30 秒)。

在处理上述异常的过程中,又出现了一个异常:

ConnectionError Traceback(最后一次调用) 单元格输入 [97],第 1 行 ----> 1 doc_store = ElasticsearchDocumentStore( 2 主机=“本地主机”, 3端口=9200, 4 方案=“https”, 5 用户名 = "用户名", 6 password = "密码", 7 索引 = "aurelius", 8个 9) ... 278 f“与 Elasticsearch 的初始连接失败。确保您在 {hosts} 运行 Elasticsearch 实例并且它已完成初始启动(可能需要 > 30 秒)。” 279) 280回头客户

ConnectionError:与 Elasticsearch 的初始连接失败。确保您在 [{'host': 'localhost', 'port': 9200}] 运行 Elasticsearch 实例,并且它已完成初始启动(可能需要 > 30 秒)。

任何想法或解决方案?我试过使用和不使用函数可以采用的参数,但没有任何效果。

【问题讨论】:

    标签: python docker elasticsearch ssl haystack


    【解决方案1】:

    似乎我只是在将安全证书从容器复制到本地机器后忘记添加参数ca_certs="../http_ca.crt"

    doc_store = ElasticsearchDocumentStore(
        host="localhost",
        port=9200,
        ca_certs="../http_ca.crt",
        scheme="https",
        username = "username",
        password = "password",
        index = "doc1"
    

    如果您在本地计算机上安装了 ElasticSearch 并且没有像我一样使用 docker 容器,那么我不确定从哪里获取证书文件,但我想这个过程应该更容易。

    【讨论】:

    • 你好!我是 elasticsearch 的新手,遇到了完全相同的问题,不知道如何添加。可以的话能详细说一下解决方法吗?非常感谢!!!!
    • 我稍微更新了答案,希望对您有所帮助。
    猜你喜欢
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    • 2020-06-21
    • 1970-01-01
    相关资源
    最近更新 更多