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,以完全控制客户端配置
相关推荐
岁岁种桃花儿26 分钟前
Kafka从入门到上天系列第一篇:kafka的安装和启动
大数据·中间件·kafka
Apache Flink1 小时前
Apache Flink Agents 0.2.0 发布公告
大数据·flink·apache
永霖光电_UVLED1 小时前
打造更优异的 UVB 激光器
大数据·制造·量子计算
m0_466525291 小时前
绿盟科技风云卫AI安全能力平台成果重磅发布
大数据·数据库·人工智能·安全
晟诺数字人1 小时前
2026年海外直播变革:数字人如何改变游戏规则
大数据·人工智能·产品运营
vx_biyesheji00011 小时前
豆瓣电影推荐系统 | Python Django 协同过滤 Echarts可视化 深度学习 大数据 毕业设计源码
大数据·爬虫·python·深度学习·django·毕业设计·echarts
2501_943695332 小时前
高职大数据与会计专业,考CDA证后能转纯数据分析岗吗?
大数据·数据挖掘·数据分析
实时数据2 小时前
通过大数据的深度分析与精准营销策略,企业能够有效实现精准引流
大数据
子榆.3 小时前
CANN 性能分析与调优实战:使用 msprof 定位瓶颈,榨干硬件每一分算力
大数据·网络·人工智能
新芒3 小时前
暖通行业两位数下滑,未来靠什么赢?
大数据·人工智能