跳到主要内容

1 篇博文 含有标签「pg_search」

查看所有标签

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。