Distribution-Based Score Fusion

A Hybrid Search fusion method, available in Qdrant since v1.11.0, that keeps each retriever’s raw scores but normalizes their distributions before combining them — a middle ground between RRF (which discards scores entirely) and plain min-max fusion (which normalizes against the observed extremes).


Formula

For each retriever’s returned set, DBSF computes the mean μ and sample standard deviation σ, then rescales every score using the 3-sigma range as endpoints:

ŝ = (s − (μ − 3σ)) / 6σ

The normalized scores are then summed across retrievers. Because each retriever now contributes on the same comparable range, differing raw score magnitudes no longer decide the outcome by themselves.

Behavior

  • Stateless / per-query — the mean and standard deviation are computed from each query’s own returned points, not from a running distribution seen across queries.
  • Not clipped to [0, 1] — scores outside the 3-sigma range remain outside that range after the remap; DBSF widens the scale, it doesn’t hard-bound it.
  • Degenerate case — if every returned score is identical (or only one point is returned), DBSF emits 0.5 rather than dividing by zero.
  • Small-sample sensitivity — the μ/σ statistics come from the prefetch’s top-k, a small sample, so a single dominant outlier in that top-k can skew normalization for the query. Increasing the prefetch limit is the mitigation.
  • Nested vs. root-level — in a multi-shard collection, DBSF nested inside a prefetch runs per shard and rescales against that shard’s own candidate distribution; root-level fusion instead combines candidates already gathered across shards.

DBSF vs. RRF

PropertyRRFDBSF
Signal usedRank position onlyRaw score, rescaled by distribution
Preserves score magnitude/leadsNo — a rank-1 document scores the same whether it led rank-2 narrowly or widelyYes — a wide lead in one retriever’s scores survives the sum
Parametersk, per-prefetch weightsNone — takes no parameters
AssumptionScore scale is not trustworthy, only order isScore magnitude carries real information
Qdrant default/recommended when unsureYes — the “safe default” without an eval setNo

RRF reads only a document’s slot in each list, so a lead in one prefetch flattens to a single rank step; DBSF keeps the scores on a shared axis, so that lead survives the sum. Qdrant’s own guidance: “DBSF is a reasonable choice when you trust your retrievers’ raw scores to carry magnitude information. On well-calibrated retrievers DBSF can outperform tuned weighted RRF; on others weighted RRF wins.” Neither dominates the other in general — the recommendation is to compare both against a labeled eval set.

Measured Results (Qdrant, five BEIR/e-commerce datasets)

How to Tune Hybrid Search in Qdrant compares DBSF against default RRF (k=2, equal weights) on five public datasets (5,183–100,000 documents), using all-MiniLM-L6-v2 for dense retrieval and Qdrant’s core BM25 for sparse, 200 candidates from each prefetch:

DatasetDBSF nDCG@10Gain over default RRF
WANDS0.7637+0.0383
DBPedia-entity0.4822+0.0184
CodeSearchNet0.6716+0.0161
SciFact0.7323+0.0148 (interval crosses zero)
ArguAna0.5171−0.0045 (interval crosses zero)

DBSF beat default RRF with a 95%-interval gain excluding zero on three of the five datasets; the SciFact and ArguAna deltas were inconclusive. DBSF also produced no tied scores at rank 10 on SciFact, versus 12.5% of default RRF’s top 10 sharing a score with an adjacent result — a side effect of using continuous rescaled scores instead of the coarse 1/(pos+k) values RRF produces at low k.

Usage (Qdrant)

from qdrant_client import QdrantClient, models
 
client.query_points(
    collection_name="products",
    prefetch=[dense_prefetch, sparse_prefetch],
    query=models.FusionQuery(fusion=models.Fusion.DBSF),
    limit=10,
)

The public API takes no k or weights for DBSF — those fields belong to RrfQuery only.

Articles