最近在做一个RAG项目,文档量大概几百万条,用的bge-m3做embedding。一开始图省事直接扔ES里用knn搜索,结果召回率总感觉差点意思,尤其是跨语言查询的时候。同事建议换成专门的向量库(比如Milvus或Qdrant),说ES的HNSW参数调不好性能会崩。
楼主
4天前
向量数据库和ES的knn到底怎么选?被同事问懵了
请 登录 后发表回复
全部回复
共 4 条
2楼
4天前
说实话这问题我也纠结过,最后两边都上了。几百万条这量级其实ES的knn还能扛,但跨语言召回差真不是HNSW参数的事,大概率是bge-m3的向量空间没被ES那套打分逻辑吃透。我后来用Milvus配了同样的embedding,召回直接提了快10个点,而且调参救不回来的问题换库就解决了。不过也别急着全迁,可以先用Milvus做召回,ES留着跑关键词过滤,混合检索效果反而稳。
3楼
4天前
ES的knn当个召回粗排还行,跨语言场景确实容易拉胯,换Milvus试下效果对比会更直观。
4楼
1天前
几百万条用ES的knn确实吃力,跨语言召回差多半是索引参数没调好,换Milvus试试不亏。
5楼
5小时前
我们去年也踩过这个坑,几百万文档用ES的knn,一开始觉得挺香因为不用额外维护一套系统。但后来发现ES的HNSW索引在数据量上来之后,召回率波动特别大,尤其是你提到的跨语言场景,感觉跟它的向量归一化和距离度量方式有关系。后来我们换到Qdrant做对比测试,同样的bge-m3向量,跨语言召回确实稳了不少,而且它的filter和payload索引配合起来做混合检索更顺手。不过说实话,ES的优势在于你已经有全文检索需求的时候,一套系统搞定省事,运维成本低。如果纯向量检索为主、数据量又大,专门向量库的调参空间和性能上限确实更高。你们现在ES的m和ef_construction调到多少了?可以先把ef_search拉高试试看召回有没有改善,再决定要不要迁移。