AI DevelopmentIndustry Guide11 min readPublished May 26, 2026

BM25 · dense vector · RRF fusion · cross-encoder reranking — the complete 2026 reference

Hybrid Search: BM25, Vector & Reranking 2026

BM25 and dense vector search each have systematic blind spots. Hybrid retrieval fuses both via Reciprocal Rank Fusion — a rank-only algorithm that sidesteps the score-incompatibility problem that breaks naively-weighted pipelines. This reference covers every layer: BM25 mechanics, dense retrieval, RRF fusion, per-vendor implementation, and cross-encoder reranking for production RAG.

DA
Digital Applied Team
Senior strategists · Published May 26, 2026
PublishedMay 26, 2026
Read time11 min
Sources8 primary
RRF rank constant
60k
Elasticsearch default
no tuning required
Voyage rerank-2.5 gain
+7.9%
vs Cohere Rerank v3.5
vendor-stated
WANDS hybrid lift
0.75
NDCG with name boost
+0.05 vs BM25 alone
Voyage context window
32K
rerank-2.5 tokens
8× Cohere Rerank v3.5

Hybrid search combines sparse keyword retrieval — BM25 — with dense vector search to handle the query types that break each approach in isolation. The fusion mechanism, Reciprocal Rank Fusion (RRF), operates on ranks not scores, which solves the score-incompatibility problem that makes naïve weighted averaging fail in production RAG pipelines.

The core tension is architectural. BM25 excels at exact-match queries — product codes, entity names, precise technical terms — but has no representation of semantic meaning. Dense retrieval excels at paraphrase and conceptual queries but struggles when the query contains a rare term that appears verbatim in only one or two documents. Neither wins across all query types. Empirical benchmarks on the WANDS e-commerce dataset confirm this: baseline BM25 and pure KNN are statistically indistinguishable at NDCG 0.6983 vs 0.6953, while a well-tuned hybrid reaches 0.7497 — a 7.4% NDCG lift over either alone.

This guide covers every layer of the hybrid retrieval stack: BM25 mechanics and its parameters, dense vector search and the ANN index types that power it, RRF fusion and why it outperforms linear score combination, per-vendor implementation details across Pinecone, Weaviate, Qdrant, and Elasticsearch, and the cross-encoder reranking layer that adds a further accuracy lift for RAG retrieval pipelines. All benchmarks are sourced to primary publications and annotated where they are vendor-stated rather than independently replicated.

Key takeaways
  1. 01
    BM25 and cosine scores are not on the same scale.BM25 produces unbounded positive integers; cosine similarity is bounded in [-1, 1]. Mixing raw scores gives BM25 dominant weight by default. RRF sidesteps this entirely by operating only on rank positions — no normalization required.
  2. 02
    RRF (k=60) consistently outperforms linear combination.The 2009 Cormack et al. SIGIR paper established that RRF beats Condorcet and individual rank-learning methods. The default rank constant k=60 is Elasticsearch's production default. Higher k gives more weight to lower-ranked documents; the algorithm requires no tuning to outperform weighted averages.
  3. 03
    Vendor fusion defaults diverged in 2024.Weaviate switched its default fusion algorithm from rankedFusion (RRF) to Relative Score Fusion in v1.24. Qdrant added server-side RRF natively in v1.10. Elasticsearch requires an Enterprise plan for native RRF — the free workaround is client-side via the ranx Python library.
  4. 04
    Cross-encoder reranking is a second-stage operation.Cross-encoders compute a joint relevance score per (query, document) pair — they cannot scan millions of documents at query time. The correct architecture is: first-stage ANN retrieval of top-100 to top-1000 candidates, then second-stage cross-encoder reranking on that shortlist.
  5. 05
    Instruction-following reranking is new in 2025.Voyage rerank-2.5 (August 2025) introduced instruction-following capability: you can prepend natural-language instructions to steer relevance judgment (e.g., 'prefer results with regulatory compliance information'). Voyage reports +7.94% accuracy vs Cohere Rerank v3.5 on a 93-dataset suite — figures are vendor-stated.

01The Core ProblemWhy neither approach wins alone.

The failure modes of sparse and dense retrieval are complementary, which is why hybrid search works: each method fills the other's blind spot.

BM25 is a lexical algorithm. It scores documents by matching query terms exactly against an inverted index. This makes it fast and highly effective when queries contain rare, distinctive terms — product SKUs, person names, error codes, regulatory references. But it has no notion of meaning: a query for “automobile repair” will miss documents that use “car maintenance” exclusively, even if they are semantically identical.

Dense vector retrieval maps both query and document into a shared embedding space, allowing semantic similarity matching via approximate nearest-neighbor (ANN) search. It handles paraphrase and conceptual queries naturally. But it can underweight exact rare-term matches — a query containing a specific product code or technical identifier may not retrieve the one document that contains that exact string, if the embedding model has never seen similar terminology in training.

As Qdrant's engineering team observed: “Neither of the algorithms performs best in all cases. In some cases, keyword-based search will be the winner and vice-versa.” The empirical answer is fusion — but the fusion mechanism matters more than most teams expect.

The score-incompatibility problem
When you combine BM25 and cosine similarity scores with a weighted formula, BM25 will always dominate — its scores are unbounded positive integers while cosine similarity is bounded in [-1, 1]. Without explicit score normalization, alpha weighting does not produce a meaningful blend. This is the gotcha that breaks naively-implemented hybrid search in production. RRF eliminates the problem by ignoring raw scores entirely.

02Sparse RetrievalBM25: the probabilistic foundation.

BM25 (Okapi BM25) is a probabilistic retrieval model developed by Stephen E. Robertson and Karen Spärck Jones at City University London in the 1980s–90s. It is the dominant sparse retrieval algorithm in production search systems today, underpinning Elasticsearch, OpenSearch, Solr, and the BM25 sparse vectors in Pinecone and Qdrant.

The two free parameters

BM25 has two tunable parameters that control its scoring behavior:

  • k1 ∈ [1.2, 2.0]— term-frequency saturation. Controls how quickly a term's score contribution saturates as it appears more times in a document. Lucene (Elasticsearch, OpenSearch) defaults to k1 = 1.2. Higher k1 means a term that appears 10 times scores notably higher than one that appears 5 times; lower k1 flattens that curve.
  • b = 0.75 — document-length normalization. Penalizes long documents to prevent them from dominating by sheer word count. b = 1.0 applies full normalization; b = 0 disables it entirely. These are typical starting values — they are tunable per-corpus.

BM25 requires no neural inference at query time — it operates entirely on an inverted index lookup. This makes it extremely fast and CPU-compatible, which is why it remains the first-stage retrieval mechanism in many high-throughput production systems even when dense retrieval is layered on top.

Learned sparse: SPLADE

SPLADE (Sparse Lexical and Expansion model) is a learned sparse encoder that maps text to BERT-vocabulary-sized sparse vectors (30,522 dimensions for bert-base-uncased). It outperforms BM25 on most BEIR benchmarks by learning implicit query expansion — but it requires GPU inference, unlike classic BM25 which needs only an inverted index. The architectural choice between BM25 and SPLADE depends on your latency and infrastructure constraints, not retrieval quality alone.

k1 parameter range
Term-frequency saturation
1.2–2.0

Controls how steeply additional term occurrences increase a document's score. Lucene defaults to 1.2. Raise toward 2.0 for long-form documents where term repetition is more meaningful.

Tunable per-corpus
b parameter default
Length normalization
0.75

Penalizes long documents to prevent volume-driven score inflation. b = 1.0 fully normalizes; b = 0 disables normalization. The 0.75 default works well for general web and enterprise corpora.

Robertson & Zaragoza 2009
SPLADE dimensions
Vocabulary-sized sparse vectors
30K+

SPLADE maps text to 30,522-dimensional sparse vectors (bert-base vocab size) and implicitly expands queries. Outperforms BM25 on BEIR but requires GPU inference — BM25 is CPU-only inverted index.

Requires neural inference

03Dense RetrievalDense vectors and approximate nearest-neighbor search.

Dense retrieval maps text into high-dimensional embedding space using a neural encoder — typically a sentence transformer or a specialized embedding model from providers like Cohere, Voyage AI, or OpenAI. Both query and documents are encoded into vectors, and retrieval becomes a similarity search: find the top-k documents whose vectors are closest to the query vector under cosine similarity or dot product.

Because exact nearest-neighbor search across millions of vectors is computationally intractable at query latency requirements, production systems use Approximate Nearest Neighbor (ANN) indexes. The dominant index type is HNSW (Hierarchical Navigable Small World), a graph-based index that trades a small recall loss for dramatically faster search. Qdrant, Weaviate, and Pinecone all use HNSW as their primary ANN structure.

The quality of dense retrieval is highly dependent on the embedding model. An embedding model trained on general web text may represent domain-specific terminology poorly — a careful embedding model selection against your specific corpus is a prerequisite before any hybrid fusion work, not an afterthought.

Matryoshka embeddings and cascaded retrieval

Matryoshka Representation Learning (MRL) produces embeddings where the first ddimensions of a full-size vector form a useful lower-dimensional embedding. Qdrant's Query API supports Matryoshka cascades — retrieve with 64-dim vectors first (fast/cheap), oversample to 128-dim for a second pass, then full-dimension for the final shortlist. This reduces ANN index traversal cost at scale while preserving recall.

"Documents that appear at the top of multiple lists are likely the most relevant."— Guillaume Laforge, Developer Advocate, Google Cloud, on the RRF premise

04Fusion AlgorithmReciprocal Rank Fusion: ranks, not scores.

RRF was formally introduced by Gordon V. Cormack, Charles L. A. Clarke, and Stefan Buettcher at the University of Waterloo in their 2009 SIGIR paper “Reciprocal Rank Fusion outperforms Condorcet and individual Rank Learning Methods.” The algorithm is deliberately simple: for each document, sum the reciprocal of its rank position across all result lists, dampened by a constant k.

The formula

score(d) = Σ(q) 1 / (k + rank(result(q), d))

Where k is a ranking constant (default 60 in Elasticsearch and most implementations) and rank(result(q), d) is the 1-indexed rank of document d in result list q. Critically, raw scores are ignored entirely — only rank positions contribute. This eliminates the BM25-vs-cosine incompatibility problem without any normalization step.

The rank constant k = 60 means a document at rank 1 contributes 1/61 ≈ 0.0164 per result list, while one at rank 100 contributes 1/160 ≈ 0.00625 — a 2.6× difference. Higher k dampens the influence of top-ranked documents and gives more weight to documents that appear consistently across many lists, even at moderate rank positions. The Elasticsearch documentation cites the Cormack paper directly: “RRF requires no tuning, and the different relevance indicators do not have to be related to each other to achieve high-quality results.”

Hybrid retrieval variants vs BM25 and KNN baselines · NDCG mean

Source: softwaredoug.com, Elasticsearch Hybrid Search Benchmarked, March 2025 · WANDS e-commerce dataset
Hybrid + name boostBM25 + dense + RRF + field boost · WANDS NDCG mean
0.750
Hybrid + all-terms clauseBM25 + dense + RRF · WANDS NDCG mean
0.719
Hybrid filterBM25 + dense + filter · WANDS NDCG mean
0.709
RRF (basic)BM25 + dense + RRF · WANDS NDCG mean
0.707
Baseline BM25Sparse only · WANDS NDCG mean
0.698
Pure KNNDense only · WANDS NDCG mean
0.695

The benchmark data from Doug Turnbull's March 2025 study on the WANDS furniture dataset makes the pattern visible: basic RRF (0.7068 NDCG mean) immediately outperforms both BM25 alone (0.6983) and pure KNN (0.6953). The bigger gains come from domain-aware tuning on top of the fused base — adding an all-terms clause lifts to 0.7191, and boosting the product name field reaches 0.7497 NDCG mean (0.8418 median). The takeaway is that RRF is a reliable no-tuning baseline, but field-level boosting of high-signal attributes can extract meaningfully more accuracy in e-commerce and structured-document settings.

Note the single-dataset caveat: WANDS covers furniture e-commerce queries. Performance characteristics on long-form technical documents, multilingual corpora, or question-answering tasks will differ. RRF's rank-based nature makes it robust across domains, but field-boosting strategies are inherently corpus-specific.

05Vendor MatrixHow each platform implements hybrid fusion.

Each major vector database exposes hybrid search differently. The table below synthesizes the current implementation details across Pinecone, Weaviate, Qdrant, and Elasticsearch — information that currently requires reading four separate vendor documentation sets to compile.

Pinecone
Alpha-weighted linear fusion

Stores both dense and sparse vectors per record in a single index. Alpha parameter: 1.0 = pure dense, 0.0 = pure sparse, 0.5 = equal weight. Built-in sparse model: pinecone-sparse-english-v0. Also supports separate index merge (client-side RRF) and multi-field document schema with integrated BM25. Without explicit alpha tuning, BM25 dominates because its unbounded scores outweigh cosine [-1,1]. Three hybrid architecture patterns documented.

Alpha = 0.75 starting point
Weaviate
Relative Score Fusion default (v1.24+)

Introduced hybrid search in v1.17 (2022) with alpha=0.75 default (majority-dense). Before v1.24: rankedFusion (RRF) was the default. From v1.24+: relativeScoreFusion is now the default. relativeScoreFusion is required to use the autocut operator with hybrid queries. Both algorithms remain available — specify fusionType explicitly if you need RRF.

Specify fusionType for RRF
Qdrant
Server-side RRF (v1.10+ Query API)

Added server-side hybrid fusion in v1.10 via the new Query API — eliminating client-side merging. Built-in RRF via models.FusionQuery(fusion=models.Fusion.RRF). Supports multi-stage pipelines: Matryoshka embedding cascades, sparse+dense RRF fusion, and ColBERT late-interaction reranking in a single nested query. When using ColBERT only for reranking (not retrieval), disable HNSW graph creation (m=0) to avoid heavy indexing overhead.

Native RRF, no plan gate
Elasticsearch
Native RRF on Enterprise plan

rrf retriever with rank_constant=60 default and rank_window_size defaulting to search size. Requires two or more child retrievers. Enterprise/paid plan required for native RRF — free (Basic) and Gold plans do not include it. Free workaround: implement RRF client-side using the ranx Python library. The rrf retriever documentation cites the Cormack 2009 paper directly.

ranx for free-tier users

The most consequential difference is the Weaviate v1.24 default change. Teams upgrading from an earlier Weaviate version without explicitly setting fusionType will silently switch from RRF to Relative Score Fusion. Both approaches work well, but they produce different result orderings — so a version upgrade could subtly shift search quality without a visible error. Always pin fusionType explicitly if you have baseline evaluations to protect.

For teams building on Elasticsearch without an Enterprise plan, the client-side RRF pattern is well-documented and production-viable. The Pinecone and Qdrant vector database comparison covers infrastructure decisions at a higher level — this guide focuses specifically on the fusion and reranking layer on top of whichever database you choose.

06Reranking LayerCross-encoder reranking: second-stage precision.

A hybrid retrieval pipeline produces a fused candidate list — say, the top 100 documents by RRF score. A cross-encoder reranker then re-scores that shortlist by computing a joint relevance score for each (query, document) pair. Unlike bi-encoder embedding models that encode query and document independently, a cross-encoder sees both simultaneously — which allows it to model fine-grained semantic relationships that embedding-space proximity misses.

The critical architectural constraint: cross-encoders are not suitable for first-stage retrieval over millions of documents at query time. The joint computation scales as O(n) with candidate count. The correct pipeline is always first-stage ANN retrieval (top-100 to top-1000 candidates) → second-stage cross-encoder reranking. Qdrant supports this pattern natively via ColBERT late-interaction reranking in the Query API.

Standard
Cohere Rerank 3.5
Cross-encoder · 100+ languages

Released December 2, 2024. Supports complex data types including tables, JSON, and code. Enhanced reasoning for multi-constraint queries. Used in production by Notion AI. The industry reference point for cross-encoder reranking quality through mid-2025.

cohere.com/rerank
Advanced
Voyage rerank-2.5
32K context · instruction-following

Released August 11, 2025. First widely available reranker with instruction-following capability — prepend natural language to steer relevance judgment. 32K token context (8× Cohere Rerank v3.5). Voyage reports +7.94% accuracy over Cohere Rerank v3.5 on 93 datasets and +12.70% on MAIR benchmark. Figures are vendor-stated.

voyageai.com/rerank
Research
LLM-based rerankers
Higher cost · OOD sensitivity

A 2025 University of Innsbruck study (arXiv:2508.16757) evaluated 22 reranking methods across 40 variants on TREC DL19, DL20, and BEIR benchmarks. LLM rerankers outperform lightweight cross-encoders on familiar queries; on novel out-of-distribution queries the gap narrows significantly.

Production cost caveat

Voyage rerank-2.5's instruction-following capability deserves separate attention. Prior rerankers were query-and-document scorers — you got the model's general notion of relevance. Instruction-following lets you specify domain context: “prefer results that include regulatory references,” “prioritize documents from technical specifications rather than marketing materials,” or “weight results about enterprise pricing above consumer pricing.” This is qualitatively different from score-based reranking and opens personalization and context-aware retrieval paths that were not available with earlier cross-encoders.

The Voyage API accepts up to 1,000 documents per rerank call, with a total-token limit of 600K tokens for rerank-2.5. At 32K context per document-pair, this is sufficient for most enterprise document chunks. The rerank-2.5 pricing is unchanged from rerank-2 — the context-window doubling came at no additional cost per the August 2025 announcement.

Cohere Rerank 3.5 remains the production baseline for teams already using the Cohere API. As Notion co-founder and CTO Simon Last noted on its release: “Cohere is a key part of what makes Notion AI work. Their reranker gives us both the speed and quality we need, and it's consistently improving.” For teams starting fresh in 2026, Voyage rerank-2.5's instruction-following and larger context window make it the stronger default — with the caveat that the published benchmark comparisons are vendor-run.

Reranker latency in practice
Cross-encoder reranking adds latency proportional to candidate count and document length, but the absolute numbers are typically millisecondsat reasonable shortlist sizes (top-100). The pattern “retrieve top-1000 → rerank top-100” is well within p99 latency budgets for interactive search. Applying a reranker to millions of documents at query time is architecturally incorrect — the first-stage ANN retrieval exists precisely to make reranking tractable.

07Pipeline ArchitectureThe complete production hybrid search stack.

A production hybrid search pipeline for RAG and vector database applications has three distinct stages. Understanding which concerns belong to which stage determines both quality and cost.

Stage 1 — Dual retrieval

Query both sparse (BM25 or SPLADE) and dense (ANN) indexes in parallel. Each returns a ranked candidate list — typically top-50 to top-500 per retrieval mode depending on your reranking budget. Whether this happens server-side (Qdrant v1.10+ Query API, Weaviate hybrid, Pinecone single-index) or client-side (Elasticsearch Basic tier with ranx) is an operational concern, not a quality one — correctly implemented, both produce the same fused list.

Stage 2 — RRF fusion

Apply RRF to the two ranked lists. The formula is simple enough to implement from scratch — you need nothing more than a dictionary of document IDs to accumulating RRF scores. For most teams, using the vendor's native implementation (Qdrant, Weaviate, Elasticsearch Enterprise) is preferable to custom code. The default k = 60 is a reliable starting point; adjust toward k = 30–40 if your use case favors top-1 precision over top-10 recall.

Stage 3 — Cross-encoder reranking

Take the top-N from the RRF-fused list (N typically 50–200) and pass each (query, document) pair to a cross-encoder. Return the top-k reranked results to the application layer. This stage is where Voyage rerank-2.5's instruction-following capability becomes actionable — the instruction is prepended to the query before each cross-encoder call, not baked into the retrieval index.

Where the AI transformation work actually lives

Most of the engineering investment in a hybrid pipeline is not in the fusion algorithm — RRF is three lines of code. The real work is in embedding model evaluation against your specific corpus, chunking strategy (document length determines whether the 32K context window of rerank-2.5 is a meaningful constraint), metadata filtering to ensure ANN candidates are within scope before reranking, and evaluation harness setup (without an NDCG or MRR baseline on your own queries, you cannot measure whether any iteration actually improved quality).

Recommended retrieval strategy by query type

Derived from: Qdrant blog, softwaredoug.com, arXiv:2508.16757 (University of Innsbruck 2025)
Exact keyword / product codeBM25 dominates — sparse retrieval
BM25
Semantic / paraphrase queryDense vector dominates
Dense
Mixed intent (most real queries)Hybrid + RRF — neither alone wins
Hybrid
Multi-constraint / domain queryHybrid + instruction-following reranker
Hybrid + Rerank
Out-of-distribution / novel termsHybrid + cross-encoder — LLM reranker gap narrows
Hybrid + CE
The retrieval stack in 2026

Hybrid search is not a setting — it is an architecture decision.

The right mental model for hybrid retrieval is a pipeline, not a toggle. BM25 and dense vector search are complementary first-stage retrievers; RRF is a fusion algorithm that works because it operates on ranks rather than incompatible raw scores; cross-encoder reranking is a second-stage precision layer that operates on a shortlist, not the full index. Conflating these stages — or trying to use a single score-weighted formula to combine BM25 and cosine similarity — is the architectural mistake that most failed production implementations share.

The vendor landscape has converged on this three-stage model in practice, even where the API surfaces differ. Qdrant's v1.10 Query API, Weaviate's hybrid search with selectable fusion type, Pinecone's alpha-weighted single-index, and Elasticsearch's rrf retriever all implement variants of retrieve → fuse → (optionally rerank). The differences are operational: plan tiers, server-side vs client-side fusion, built-in sparse encoders, and the fusion algorithm defaults that changed in Weaviate v1.24.

For teams building AI-driven content and retrieval systems, the practical recommendation is to start with RRF at k = 60 on top of your existing dual-retrieval setup, evaluate on your own query set with NDCG or MRR, and add cross-encoder reranking only where latency and cost budgets allow. Voyage rerank-2.5's instruction-following capability makes the reranking layer more powerful than it was a year ago — but the step-function improvement comes from measuring, not from selecting the “best” reranker on a vendor benchmark.

Production hybrid search implementation

Better retrieval means better answers.

We design and implement hybrid retrieval pipelines for production RAG systems — embedding model evaluation, RRF fusion configuration, cross-encoder reranking, and end-to-end accuracy benchmarking against your corpus.

Free consultationExpert guidanceTailored solutions
What we cover

Hybrid retrieval engagements

  • Embedding model selection and evaluation against your corpus
  • BM25 + dense dual-retrieval index setup (Pinecone, Qdrant, Weaviate)
  • RRF fusion configuration and baseline NDCG benchmarking
  • Cross-encoder reranking integration (Cohere, Voyage rerank-2.5)
  • End-to-end RAG pipeline review and production hardening
FAQ · Hybrid Search Reference

The questions we get every week.

Hybrid search fuses sparse keyword retrieval (BM25) with dense vector retrieval in a single pipeline. BM25 excels at exact-match queries — product codes, named entities, rare technical terms — but cannot handle semantic paraphrase. Dense vector retrieval handles conceptual and paraphrase queries but may underweight exact rare-term matches. Neither wins consistently across all query types. Hybrid retrieval using Reciprocal Rank Fusion combines the ranked results from both approaches, producing consistently higher NDCG than either alone. On the WANDS e-commerce benchmark, basic RRF (NDCG 0.7068) outperforms both BM25 alone (0.6983) and pure KNN (0.6953), with well-tuned hybrid variants reaching 0.7497.