Fusion score normalization strategies
Parent: Atlas Hybrid Fusion and BM25 Diagnostics · Published reference · snapshot 2026-10-15 · viability 3.45 / 5 (research)
↓ Facts as markdownall context files
Depth-first rabbithole dossier for Fusion score normalization strategies; source-anchored research pack.
These notes link each claim to its source. Some citations identify archived research reports that are no longer hosted on this site. A published reference means the content is available; it does not certify independent review or accuracy.Read the editorial policy and follow the sources before relying on a claim.
Definitions
- [low] The `details` field in `scoreDetails` is an array of objects providing a recursive breakdown of the score for each match based on subsets of the scoring formula. Sources: https://www.mongodb.com/docs/search/query/score/get-details.md [source]
- [low] In Elastic's linear retriever, the final score is the sum of weighted normalized scores: Score = sum_i(weight_i x Normalizer(Score_i)). Sources: https://www.elastic.co/docs/reference/elasticsearch/rest-apis/retrievers/linear-retriever [source]
How it works
- [low] BM25 score distributions shift as the index grows and term frequencies change, while vector score distributions shift when embedding models are swapped. Sources: https://redis.io/blog/reciprocal-rank-fusion/ [source]
Problems, failure modes and limitations
- [low] Summing BM25 and vector scores without normalization is an antipattern because BM25 often wins by default due to absolute values being an order of magnitude larger. Sources: https://redis.io/blog/reciprocal-rank-fusion/ [source]
- [low] The upper limit of an RRF score is bounded by the number of queries being fused, with each query contributing a maximum of approximately 1/k to the score. Sources: https://learn.microsoft.com/azure/search/hybrid-search-ranking [source]
- [low] Using `none` as a normalizer is an antipattern because it disables normalization and may bias the result set towards lexical matches. Sources: https://www.elastic.co/docs/reference/elasticsearch/rest-apis/retrievers/linear-retriever [source]
Comparisons and alternatives
- [low] In the atlas-search-vs-vector-marketplace demo, `$scoreFusion` (RSF) combines by real scores normalized with `minMaxScaler`; MongoDB also supports `none` and `sigmoid`. Sources: https://github.com/adrianofratelli-glitch/atlas-search-vs-vector-marketplace [source]
- [low] BM25 scores do not have a fixed universal range and vary with implementation, query, and corpus, unlike cosine similarity which is fixed between -1 and 1. Sources: https://redis.io/blog/reciprocal-rank-fusion/ [source]
- [low] Native fusion is not necessarily faster than client-side fusion, but its value lies in a single round trip and keeping fusion logic in the database rather than in every client. Sources: https://github.com/adrianofratelli-glitch/atlas-search-vs-vector-marketplace [source]
- [low] Mass ties in Atlas Search lexical scores from synthetic catalogs with near-identical text can collapse `$rankFusion` (same rank) and `$scoreFusion`/`minMaxScaler` (0/0 → 0), which is a property of BM25 over finite vocabulary, not a bug. Sources: https://github.com/adrianofratelli-glitch/atlas-search-vs-vector-marketplace [source]
Facts and statements
- [low] DAT (Dynamic Alpha Tuning) uses an LLM to score the top-1 results of dense and BM25 retrieval and calibrates the per-query weighting factor through effectiveness score normalization; it is not a convex-combination fusion. Sources: https://arxiv.org/abs/2503.23013 [source]
- [low] Learning a Convex Combination (CC) fusion is generally agnostic to the choice of score normalization, whereas Reciprocal Rank Fusion (RRF) is sensitive to its parameters. Sources: https://arxiv.org/abs/2210.11934 [source]
- [medium] The `$scoreFusion` stage supports three normalization methods: `none` (combines scores as-is), `sigmoid` (maps scores to (0, 1) via $sigmoid), and `minMaxScaler` (maps lowest score to 0 and highest to 1 via min-max scaling). Sources: https://www.mongodb.com/docs/vector-search/hybrid-search/hybrid-search-overview.md, https://www.mongodb.com/docs/manual/reference/operator/aggregation/score.md [source]
- [medium] In `$scoreFusion`, `input.normalization` normalizes the score to the range 0 to 1 before combining results (values `none`, `sigmoid`, `minMaxScaler`); `none` applies no normalization. The sources describe normalization as optional only for `$score`. Sources: https://www.mongodb.com/docs/manual/reference/operator/aggregation/scoreFusion.md, https://www.mongodb.com/docs/manual/reference/operator/aggregation/score.md [source]
- [low] In a `$rankFusion` hybrid search, `scoreDetails.details.value` shows the raw score from that pipeline before it is weighted and combined by reciprocal rank fusion, and `scoreDetails.value` shows the weighted reciprocal rank score. For `$scoreFusion`, the raw score is `inputPipelineRawScore`. Sources: https://www.mongodb.com/docs/vector-search/hybrid-search/vector-search-with-full-text-search.md [source]
- [medium] The reciprocal rank fusion score is computed as the sum of (weight * (1 / (60 + rank))) across input pipelines, where 60 is a sensitivity parameter determined by MongoDB. Sources: https://www.mongodb.com/docs/manual/reference/operator/aggregation/rankFusion.md, https://www.mongodb.com/docs/vector-search/hybrid-search/vector-search-with-full-text-search.md [source]
- [high] Reciprocal Rank Fusion (RRF) calculates the score as 1/(rank + k), where k is a constant (often 60), and the engine sums reciprocal rank scores from each search system to produce a combined score. Sources: https://weaviate.io/blog/hybrid-search-fusion-algorithms, https://learn.microsoft.com/azure/search/hybrid-search-ranking [source]
- [low] A single outlier score can compress other scores into a narrow band, and the optimal blend between keyword and vector shifts from query to query, making static normalization challenging. Sources: https://redis.io/blog/reciprocal-rank-fusion/ [source]
- [medium] The default combination method for `$scoreFusion` is `avg`, which averages the weighted scores, and the `score` expression computes a new value stored in the `$meta` keyword `score`. Sources: https://www.mongodb.com/docs/manual/reference/operator/aggregation/scoreFusion.md, https://www.mongodb.com/docs/vector-search/hybrid-search/hybrid-search-overview.md, https://www.mongodb.com/docs/manual/reference/operator/aggregation/score.md [source]
- [medium] The `scoreDetails` option defaults to `false` in `$scoreFusion`, and if set to `true`, it creates a `scoreDetails` metadata field for each document, though it is not automatically output and must be explicitly set via `$meta`. Sources: https://www.mongodb.com/docs/search/query/score/get-details.md, https://www.mongodb.com/docs/manual/reference/operator/aggregation/scoreFusion.md [source]
- [low] The `scoreDetails` option breaks down scoring factors to analyze why a document matched, with the top-level `value` equal to `$searchScore` and `description` showing the entire scoring formula. Sources: https://www.mongodb.com/docs/search/query/score/get-details.md [source]
- [low] The `scoreDetails` option for `$score` defaults to `false` and, if true, computes and populates the `$scoreDetails` metadata field for each output document; this feature is new in version 8.2. (verified as of 2026-10-15) Sources: https://www.mongodb.com/docs/manual/reference/operator/aggregation/score.md [source]
- [low] Elastic's linear retriever `minmax` normalizer uses score = (score - min) / (max - min). Sources: https://www.elastic.co/docs/reference/elasticsearch/rest-apis/retrievers/linear-retriever [source]
- [low] In Elastic Stack, the `l2_norm` normalizer normalizes scores using the L2 norm and is generally available since version 9.1. (verified as of 2026-10-15) Sources: https://www.elastic.co/docs/reference/elasticsearch/rest-apis/retrievers/linear-retriever [source]
- [low] The two-level normalization formula for ensuring equal contribution from semantic and lexical fields is Score_total = Normalizer(\sum_{s \in Semantic} Normalizer(Score_s)) + Normalizer(\sum_{l \in Lexical} Score_l). Sources: https://www.elastic.co/docs/reference/elasticsearch/rest-apis/retrievers/linear-retriever [source]
- [low] Semantic ranking occurs after RRF merging of results, and the reranker score (`@search.rerankerScore`) is always reported separately in the query response. Sources: https://learn.microsoft.com/azure/search/hybrid-search-ranking [source]
- [low] The resulting list after combining scores from multiple search systems is the fused ranking. Sources: https://learn.microsoft.com/azure/search/hybrid-search-ranking [source]
- [low] In a methodology example, the `score` metadata field for Document1 is 0.0322664585, and its RRF score is calculated as 1/63 + 1/61. Sources: https://www.mongodb.com/docs/manual/reference/operator/aggregation/rankFusion.md [source]
Related concepts
- score — is a part of Fusion score normalization strategies
- normalization — is a part of Fusion score normalization strategies
- Fusion — is a part of Fusion score normalization strategies
Children
- No children recorded.