
用 AlloyDB 与 RRF 简化 AI 混合搜索

AlloyDB for PostgreSQL 本身同时支持向量搜索和全文检索(FTS),但两者要组合成混合搜索时,结果融合是个麻烦。向量查询产出距离分数,FTS 产出相关性分数,把它们合并通常要靠复杂 SQL 或应用层自定义代码,还需要维护一套独立的分数归一化与重排逻辑。这篇文章介绍 AlloyDB AI 最近更新的混合搜索能力,核心是引入 Reciprocal Rank Fusion(RRF),把多步流程压缩成一次 SQL 调用。
RRF 直接绕过了分数归一化这个脆弱步骤,因为公式只用排名,不关心分数绝对值。具体做法是:调用统一的 ai.hybrid_search() 函数,把搜索组件写成声明式 JSON 数组传入;函数在单个查询计划内动态生成 CTE,每个 CTE 用 ROW_NUMBER() 计算各自结果的位次;然后基于文档 ID 做 FULL OUTER JOIN 合并;最后按 RRF 公式算出统一分数。整个过程在数据库内核完成,不需要应用侧连接,也不用手动调归一化公式。文章提到 RRF 是当前算法,之后还会加入其它合并与排序选项。
FTS 的性能也做了补强。标准 PostgreSQL GIN 索引不保存词的位置信息,做相关性排序和短语匹配时要回表重新分析,成为瓶颈。新的 RUM 扩展把每个词的位置直接存在索引里,排序和短语匹配大部分在索引内完成,避免堆扫描,延迟更低。代价是索引构建更慢、磁盘占用更大。如果工作负载更看重查询速度与排序精度,RUM 更合适。文章在多个 BEIR 数据集上展示了 RUM 相对 GIN 的加速效果。
另一个更新是 BM25 索引,通过 pg_textsearch 扩展进入 Cloud SQL 和 AlloyDB 预览。BM25 基于 TF-IDF,处理了词频饱和与文档长度归一化,关键词打分精度更高。需要行业标准相关度排序时,可以直接用原生 BM25 索引,不依赖外部搜索引擎。
对外扩展方面,AlloyDB AI 新增外部搜索 Foreign Data Wrapper(FDW),目前支持 Elasticsearch、OpenSearch、Solr。你可以从 AlloyDB 环境内用标准 SQL 查询外部集群,保留原有搜索基础设施,同时把结果纳入混合搜索框架。文章提供了 Elasticsearch 和 Solr 集成的端到端代码示例。
整体来看,AlloyDB AI 想表达的是:混合搜索的难点不在技术本身,而在架构和运维的简化。它用 RRF 统一了融合逻辑,用 RUM 与 BM25 提供两条 FTS 路径——一个偏延迟、一个偏精度,再用 FDW 接入外部专用搜索引擎。这篇文章的价值在于把碎片化操作背后的架构取舍讲清楚了。


