Reciprocal Rank Fusion, Explained
Reciprocal Rank Fusion, Explained

How do you merge results from two search systems that score on completely different scales?
That's the central problem in hybrid search. You've got a dense vector retriever putting out cosine similarities between 0 and 1, and a BM25 keyword retriever putting out TF-IDF scores from 0 to 30 and up. The result sets partly overlap and you need one ranked list. You can't just average the scores, because 0.91 cosine and 24.1 BM25 aren't the same kind of number.
Reciprocal Rank Fusion gets around this by ignoring the scores completely.
The formula is RRF(d) = Σ 1/(k + rank(d)), with k=60.
It only cares about rank position. A document that's #1 in one list and #5 in the other lands at a different fused score than one that's #3 in both, no matter what the raw scores were.
Here's why that holds up. Score distributions are all over the place between retrievers. Dense vector scores bunch up tight, say 0.85 to 0.94, while BM25 spreads across a much wider range. Average them and the wider distribution just takes over. Rank positions don't have that problem. Position #1 means "best match by this method" no matter what number is attached. And there's nothing to tune, no per-retriever weights to calibrate.
The catch is that RRF is the safe default, not the optimal answer. Weighted fusion gives you more control if you're willing to calibrate it. Learned fusion trains the weights on real user interactions for the best quality, but it needs a feedback loop.
Start with RRF. Move to learned fusion once you've collected enough click and conversion data.
Where this diagram appears
Run this on your own data
Mixpeek turns video, images, audio, and documents in your object storage into searchable, timestamped results through one API.
Search your own data, free