Elasticsearch BM25 检索器连接问题解决方案

Elasticsearch BM25 检索器连接问题解决方案

1 问题分析

在 SafeRAG 项目中使用 BM25 检索器时遇到 Elasticsearch 连接问题。根本原因包括:

  1. 协议不匹配: 原代码使用 HTTP 连接,但 Elasticsearch 9.2.0 默认启用了 HTTPS
  2. 缺少身份验证: Elasticsearch 启用了安全特性,需要用户名和密码认证
  3. 客户端类型错误 : llama_indexElasticsearchStore 需要异步客户端,但原代码使用同步客户端

2 问题排查步骤

1. 检查 Elasticsearch 服务状态

复制代码
sudo systemctl status elasticsearch

确认服务正在运行

2. 检查端口监听

复制代码
sudo lsof -i :9200

确认 Elasticsearch 在 9200 端口监听

3. 测试连接

复制代码
# 测试 HTTP 连接(会失败)  
curl http://localhost:9200  
  
# 测试 HTTPS 连接(需要认证)  
curl -k https://localhost:9200  
  
# 使用认证测试  
curl -k -u elastic:PASSWORD https://localhost:9200

4. 重置 Elasticsearch 密码

复制代码
sudo /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic

记录生成的新密码

5. 查看错误日志

复制代码
sudo tail -n 100 /var/log/elasticsearch/elasticsearch.log

关键错误信息:

  • received plaintext http traffic on an https channel - 协议不匹配
  • TypeError: object HeadApiResponse can't be used in 'await' expression - 客户端类型错误

3 解决方案1 (最简单)

完全禁用 Elasticsearch 安全功能

编辑 elasticsearch.yml 配置文件:

bash 复制代码
 sudo vim /etc/elasticsearch/elasticsearch.yml

完全禁用安全功能 ,将3个地方设置为false

txt 复制代码
xpack.security.enabled: false  
xpack.security.http.ssl.enabled: false  
xpack.security.transport.ssl.enabled: false

重启服务

bash 复制代码
sudo systemctl restart elasticsearch

4 解决方案2

(1)修改 retrievers/bm25.py 文件

修改客户端初始化 (第50行)

修改前:

复制代码
self.es_client = Elasticsearch([{'host': 'localhost', 'port': 9200, "scheme": "http"}])

修改后:

复制代码
from elasticsearch import AsyncElasticsearch  
  
self.es_client = AsyncElasticsearch(  
    ["https://localhost:9200"],  
    basic_auth=("elastic", "YOUR_PASSWORD"),  # 使用重置后的密码  
    verify_certs=False,  
    ssl_show_warn=False  
)

修改 construct_index 方法 (约第79行)

修改前:

复制代码
vector_store = ElasticsearchStore(  
    index_name=self.collection_name,  
    es_url="http://localhost:9200"  
)

修改后:

复制代码
vector_store = ElasticsearchStore(  
    index_name=self.collection_name,  
    es_client=self.es_client  # 传入配置好的客户端  
)
  1. 修改 construct_attack_index 方法 (约第118行)

同样将 es_url 参数改为 es_client 参数


总结:

  1. 使用 AsyncElasticsearch : llama_indexElasticsearchStore 内部使用异步操作,必须传入异步客户端
  2. HTTPS 协议 : Elasticsearch 9.2.0 默认启用 SSL/TLS,需使用 https:// 协议
  3. 禁用证书验证 : 开发环境中使用 verify_certs=False 跳过自签名证书验证
  4. 传入客户端对象 : 使用 es_client 参数而非 es_url,以完全控制客户端配置
相关推荐
忆~遂愿11 分钟前
ops-cv 算子库深度解析:面向视觉任务的硬件优化与数据布局(NCHW/NHWC)策略
java·大数据·linux·人工智能
忆~遂愿1 小时前
GE 引擎与算子版本控制:确保前向兼容性与图重写策略的稳定性
大数据·开发语言·docker
米羊1211 小时前
已有安全措施确认(上)
大数据·网络
人道领域2 小时前
AI抢人大战:谁在收割你的红包
大数据·人工智能·算法
qq_12498707533 小时前
基于Hadoop的信贷风险评估的数据可视化分析与预测系统的设计与实现(源码+论文+部署+安装)
大数据·人工智能·hadoop·分布式·信息可视化·毕业设计·计算机毕业设计
Hello.Reader3 小时前
Flink 使用 Amazon S3 读写、Checkpoint、插件选择与性能优化
大数据·flink
零售ERP菜鸟3 小时前
范式革命:从“信息化”到“数字化”的本质跃迁
大数据·人工智能·职场和发展·创业创新·学习方法·业界资讯
Hello.Reader4 小时前
Flink 对接 Google Cloud Storage(GCS)读写、Checkpoint、插件安装与生产配置指南
大数据·flink
浪子小院5 小时前
ModelEngine 智能体全流程开发实战:从 0 到 1 搭建多协作办公助手
大数据·人工智能
闲人编程5 小时前
Elasticsearch搜索引擎集成指南
python·elasticsearch·搜索引擎·jenkins·索引·副本·分片