Relative Score Fusion

A hybrid search fusion strategy that normalizes scores from multiple retrieval systems to a common scale and combines them linearly, preserving score magnitude information that Reciprocal Rank Fusion (RRF) discards.

Part of the “classic hybrid search techniques” alongside RRF, as described in Erik Hatcher’s MongoDB hybrid search series.


How It Works

  1. Retrieve results from each retrieval system (e.g., BM25, dense vector)
  2. Normalize each system’s scores to [0, 1] using min-max or other normalization
  3. Combine normalized scores: final = α × score_lexical + (1 − α) × score_dense

Normalization is the whole game

The combination step is trivial; the Score Normalization step decides the outcome. Engines typically offer three modes:

ModeBehaviorRisk
noneRaw scores combined as-isOnly safe when pipelines already share a scale
minMaxScalerLinear map of observed [min, max] to [0, 1]One outlier stretches the range and flattens the rest
sigmoidLogistic squash into (0, 1)Bounded for any input, but saturates — values far from the curve’s center collapse to 0 or 1

Saturation is the non-obvious failure. In Erik Hatcher’s worked example, one pipeline’s scores span 0–100 and the other’s span 0–5; sigmoid maps a raw 85.0 to exactly 1.0, erasing every gradation within that pipeline, while the 0–5 pipeline retains its resolution. The fusion then averages a flattened signal against a live one. Knowing each pipeline’s actual range is a prerequisite, not a refinement.

Combination

Once normalized and weighted, values are combined either by averaging (the usual default) or by a custom expression. Note the ordering: normalize → weight → combine. Weights applied to un-normalized scores compound the scale mismatch instead of correcting it.

RRF vs RSF

PropertyRRFRSF
Uses score valuesNo (rank only)Yes
Score normalization requiredNoYes
Sensitive to score outliersNoYes
Preserves score magnitudeNoYes
Parameter-freeYes (except k)No (requires α)

Limitations

  • Requires score normalization across systems with incompatible scales
  • Score distributions can differ per query, making normalization unstable
  • Needs α weight tuning, unlike RRF which is robust out of the box
  • Min-max normalization is only as stable as the extremes: one outlier lexical score stretches the range and flattens everything else. L2 is steadier on noisy corpora.
  • Omitting the normalization step doesn’t degrade gracefully — it silently hands the ranking to whichever branch has the larger scale. See Hybrid Fusion Failure - BM25 Displacing Reference Documents.

In MongoDB

$scoreFusion takes input.normalization (none / sigmoid / minMaxScaler) and combination.method (avg by default, or a custom expression). Where a pipeline doesn’t naturally emit a score, the $score stage computes one into $meta.score — but $search and $vectorSearch already provide scores, so $score isn’t used with them.

The asymmetry that matters: $vectorSearch scores already sit in 0.0–1.0, whereas lexical $search BM25 scores have no defined range at all. Normalizing the lexical leg is almost always warranted.

Articles