ParadeDB 的混合检索与 RRF:文本和向量装在同一个索引里,但融合那一段要自己写 SQL
· 阅读需 21 分钟
Postgres 上做混合检索,过去的标准姿势是「pgvector 管向量 + tsvector 管关键词 + 一条 SQL 自己融合」——本站 pgvector 入门 里那条 WITH ... RRF 就是这个写法。
ParadeDB 想解决的是这套姿势里最别扭的部分:两套索引、两份候选、两个计划。它的答案是——把文本列和向量列放进同一个索引,让 BM25 和向量距离在同一趟扫描里完成。
但有个反直觉的事实,我这次实测才确认:
ParadeDB 不提供
rrf()函数,也不提供hybrid_search()之类的 API。 它的「RRF」是一段要你自己写的 SQL 模式——RANK()窗口函数排名次、weight / (k + rank)算权重、sum()融合。
我查了 pg_proc,pg_search 0.25.10 里不存在任何名字含 rrf / fuse 的函数。这和 Milvus 是两个路线:Milvus 内置 RRFRanker()(本站 Milvus 入门 验算过它的分数就是教科书公式),ParadeDB 则把融合层的控制权原样交回 SQL。
这篇把它的实现路径跑了一遍,所有数字都来自真实执行(脚本与日志留档在 source/paradedb/)。
命名说明:你说的「RFF 算法」,业界标准名是 RRF(Reciprocal Rank Fusion,互惠排名融合),本文统一用 RRF。
