Reciprocal rank fusion carries a constant that almost every implementation sets to 60. That number was tuned on collections of thousands of documents. Above a threshold you can derive in one line, it stops damping the ranks and starts erasing them, and fusion quietly turns into a vote.
A hybrid retriever runs two searches over the same corpus. A lexical index scores by term statistics; a vector index scores by cosine distance. The two numbers are not comparable. BM25 scores are unbounded and depend on corpus statistics, cosine similarities sit in a fixed range and cluster tightly, and neither is calibrated against the other. Normalizing them requires assuming a distribution that neither guarantees.
Reciprocal rank fusion sidesteps the problem by discarding the scores and keeping only the order. A document's fused score is the sum, across the lists that contain it, of one over its rank plus a constant:
Rank is the common currency, so nothing needs to be calibrated. The method is from Cormack, Clarke and Buettcher, Reciprocal Rank Fusion outperforms Condorcet and individual Rank Learning Methods, SIGIR 2009.
The constant k controls how quickly a document's contribution decays as it falls
down a list. Set it small and the top of each list dominates: first place is worth far more than
fifth. Set it large and every contribution converges toward 1/k, so the differences
between ranks shrink toward nothing and what remains is essentially a count of how many lists
contain the document.
That flattening is intentional. It is what stops one retriever's confident outlier from carrying the fused list. The question is how much flattening a given setup can absorb.
Take two retrievers and ask when a document ranked first by one ties with a document ranked
r-th by both. The first scores 1/(k+1). The second scores
2/(k+r). Setting them equal:
So a single first place is worth exactly as much as agreement at rank k+2. That one
identity is the whole story, because it tells you the rank at which consensus starts to lose to
conviction, and you can compare it directly against the number of candidates you actually
retrieve.
| k | agreement ties a first place at rank | with 24 candidates per list |
|---|---|---|
| 10 | 12 | ranks carry information |
| 60 | 62 | unreachable: fusion is a vote |
If each retriever returns 24 candidates, rank 62 does not exist. Every document found by both retrievers outranks every document found by only one, whatever the positions were. The ranks are still computed, still passed in, and no longer affect the result. Nothing errors, the output looks reasonable, and an entire input signal has been discarded.
The 2009 paper fused runs over TREC collections, where lists run to thousands of documents. At that size, rank 62 is an ordinary position in the middle of a list, and a constant of 60 damps outliers while leaving plenty of resolution among the leaders. The number is not arbitrary and it is not wrong. It was fitted to a problem two or three orders of magnitude larger than a modern application-level hybrid search over a few dozen candidates.
The default outlived the setting it was measured in. That is the ordinary way a good number becomes a bad one.
Both major implementations inherit the paper's constant, with a meaningful difference in whether you can change it. Verified against current source, August 2026.
| library | constant | configurable |
|---|---|---|
LangChain EnsembleRetriever |
c: int = 60, scoring weight / (rank + self.c) |
Yes, a field on the retriever |
LlamaIndex QueryFusionRetriever |
k = 60.0, a local inside _reciprocal_rerank_fusion |
No, not exposed on the constructor |
LangChain's docstring describes c accurately as "a constant added to the rank,
controlling the balance between the importance of high-ranked items and the consideration given to
lower-ranked items," which is exactly the dial discussed above. LlamaIndex's comment reads "The
original paper uses k=60 for best results," which is true of the paper and silent on whether it
holds for the caller's pool size.
The constant should be set from the number of candidates each retriever returns, not inherited.
The derivation gives a hard ceiling: once k + 2 exceeds the pool, ranks are decorative,
so k has to sit well below the pool size for fusion to be doing anything. Below that
ceiling the choice is empirical, and it should be swept against a retrieval metric on a held-out
set rather than argued.
Two honest caveats. First, when both retrievers largely agree, the fused order barely moves and the constant makes little measurable difference; the effect concentrates in exactly the disagreement cases hybrid search exists to handle. Second, a retrieval metric such as MRR rewards ordering, and if every retrieved passage is placed into a model's context regardless of position, ordering matters less than recall. Measure the thing the system actually depends on.
None of this is a defect in reciprocal rank fusion, which is a good method, or in the libraries, which implement the published formula faithfully. It is what happens when a constant fitted at one scale is carried, unexamined, to another. The check costs one line of arithmetic.
Reference: G. V. Cormack, C. L. A. Clarke, S. Buettcher.
Reciprocal Rank Fusion
outperforms Condorcet and individual Rank Learning Methods. SIGIR 2009.
Main Abstraction