"Keyword search finds the words you typed. Vector search finds the meaning you meant. Fusion is how you stop choosing between them."
What Vectors Add
An embedding model turns a piece of text into a point in a high-dimensional space — Lantern uses one that produces a 1024-dimensional vector. The magic property: texts that mean similar things land near each other, even when they share no words. Search "how do I keep my cool under market panic" and vector search can surface a passage about "emotional discipline during a crash," which BM25 would miss entirely because not one keyword overlaps. Vectors retrieve by meaning, and that's exactly the case keyword search is blind to.
The Fusion Problem
So now you run both and you have two ranked lists: BM25's keyword hits and the vector store's semantic hits. You want one merged ranking. Here's the trap: their scores live on incomparable scales. A BM25 score and a cosine similarity aren't the same kind of number — you can't just add them, and normalizing them into a shared range is fiddly, brittle, and needs constant re-tuning as your data shifts. Naive score blending is where hybrid search quietly goes wrong.
RRF: Fuse by Rank, Not Score
Reciprocal Rank Fusion sidesteps the whole mess with one idea: ignore the scores, use only the rank positions. Each result gets, from every list it appears in, a contribution of 1 / (k + rank), where rank is its position in that list and k is a small constant (60 is the well-worn default). Sum those contributions across lists and sort. A document ranked #1 in either list scores well; a document ranked highly in both scores best of all. No score normalization ever happens, because scores never enter the math.
Why This Beats Clever Score Math
You could try to learn optimal weights, calibrate score distributions, or train a fusion model. RRF asks: why? It has essentially one parameter, needs no training, is robust to wildly different score scales, and empirically holds its own against far fancier methods. That combination — nearly free, nearly parameterless, hard to break — is why it's the default fusion in serious hybrid engines. The vector half also needs the embedding server, so when that's down, hybrid degrades to keyword-only and says so; RRF just fuses whatever lists it was handed.