pg_rrf

pg_rrf : Reciprocal rank fusion functions for hybrid search

Overview

IDExtensionPackageVersionCategoryLicenseLanguage
1845
pg_rrf
pg_rrf
0.0.3
RAG
MIT
Rust
AttributeHas BinaryHas LibraryNeed LoadHas DDLRelocatableTrusted
--s-d--
No
Yes
No
Yes
no
no

manually upgraded PGRX from 0.16.1 to 0.17.0 by Vonng

Packages

TypeRepoVersionPG Major CompatibilityPackage PatternDependencies
EXT
PIGSTY
0.0.3
18
17
16
15
14
pg_rrf-
RPM
PIGSTY
0.0.3
18
17
16
15
14
pg_rrf_$v-
DEB
PIGSTY
0.0.3
18
17
16
15
14
postgresql-$v-pg-rrf-
Linux / PGPG18PG17PG16PG15PG14
el8.x86_64
MISS
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
el8.aarch64
MISS
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
el9.x86_64
MISS
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
el9.aarch64
MISS
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
el10.x86_64
MISS
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
el10.aarch64
MISS
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
d12.x86_64
MISS
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
d12.aarch64
MISS
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
d13.x86_64
MISS
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
d13.aarch64
MISS
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
u22.x86_64
MISS
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
u22.aarch64
MISS
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
u24.x86_64
MISS
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
u24.aarch64
MISS
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3

Source

pig build pkg pg_rrf;		# build rpm/deb

Install

Make sure PGDG and PIGSTY repo available:

pig repo add pgsql -u   # add both repo and update cache

Install this extension with pig:

pig install pg_rrf;		# install via package name, for the active PG version

pig install pg_rrf -v 17;   # install for PG 17
pig install pg_rrf -v 16;   # install for PG 16
pig install pg_rrf -v 15;   # install for PG 15
pig install pg_rrf -v 14;   # install for PG 14

Create this extension with:

CREATE EXTENSION pg_rrf;

Usage

Sources: README and project repo.

pg_rrf provides Reciprocal Rank Fusion functions for hybrid search score fusion. It is focused on combining ranked candidate lists without hand-written FULL OUTER JOIN / COALESCE plumbing.

Core Functions

  • rrf(rank_a, rank_b, k)
  • rrf3(rank_a, rank_b, rank_c, k)
  • rrf_fuse(ids_a bigint[], ids_b bigint[], k int default 60)
  • rrfn(ranks bigint[], k int)

The README also documents the behavior of the score helpers:

  • missing ranks are ignored
  • ranks <= 0 are ignored
  • k <= 0 raises an error

Example

CREATE EXTENSION pg_rrf;

SELECT rrf(1, 2, 60) AS rrf_12;
SELECT rrf3(1, 2, 3, 60) AS rrf_123;
SELECT rrfn(ARRAY[1, 2, 3], 60) AS rrfn_123;
SELECT *
FROM rrf_fuse(ARRAY[10, 20, 30], ARRAY[20, 40], 60)
ORDER BY score DESC;

Hybrid Search Pattern

The upstream README shows rrf_fuse as a replacement for a manual fusion query:

WITH fused AS (
  SELECT *
  FROM rrf_fuse(
    ARRAY(SELECT id FROM docs ORDER BY bm25_score DESC LIMIT 100),
    ARRAY(SELECT id FROM docs ORDER BY embedding <=> :qvec LIMIT 100),
    60
  )
)
SELECT d.*, fused.score
FROM fused
JOIN docs d USING (id)
ORDER BY fused.score DESC
LIMIT 20;

Requirements

  • PostgreSQL 14-17
  • Docker and Docker Compose v2

The README says the build and test flow runs in Docker, so local PostgreSQL and Rust toolchains are not required for the package workflow.

Last updated on