{"post":{"slug":"hybrid-search-bm25-2026","title":"Hybrid Search: Why Keywords Still Beat Embeddings Sometimes","excerpt":"Dense retrieval misses exact matches that keyword search finds instantly. Here is how hybrid search combines them, and how fusion actually works.","category":"ai","date":"July 25, 2026","author":"ByteLedger Team","content":"<span class=\"dropcap\">S</span>omeone searches for a specific error code, a part number, or an unusual surname. Dense embedding search — which matches on meaning — has no strong signal for a string it has essentially never seen, and returns documents that are topically adjacent and do not contain it. Keyword search finds it immediately, because the string is either present or absent.\n\nThat failure mode is not an edge case. It is a large share of real search traffic in any technical or commercial corpus.\n\n## What changed in 2026\n\n- **Hybrid became the default recommendation.** Guidance shifted from dense-only to hybrid as the standard starting architecture rather than an optimization.\n- **Vector databases added keyword support natively.** Running both retrieval methods in one system, rather than maintaining two, became common.\n- **Rank fusion consolidated.** Reciprocal rank fusion emerged as the robust default for combining results, displacing score-weighted approaches.\n- **Learned sparse retrieval matured.** Methods producing sparse representations with learned term weights offered a middle path, covered in [sparse embeddings explained](/blog/sparse-embeddings-explained-2026).\n\n## Where each method wins\n\n| Query type | Dense embeddings | Keyword search |\n| --- | --- | --- |\n| Conceptual question, different wording | Strong | Weak |\n| Synonyms and paraphrase | Strong | Weak |\n| Exact identifier or error code | Weak | Strong |\n| Rare proper noun | Weak | Strong |\n| Acronym or product name | Variable | Strong |\n| Cross-lingual matching | Strong with the right model | Weak |\n| Very short queries | Variable | Often strong |\n| Long descriptive queries | Strong | Weaker |\n\nThe complementarity is nearly ideal. The queries dense retrieval handles badly are precisely the ones keyword search handles trivially, and vice versa. That is why combining them produces a larger improvement than either method's own tuning typically delivers.\n\n## How fusion works\n\nThe naive approach — normalize both scores and add them — does not work well, because the two methods produce scores on incomparable scales with different distributions. A tuned weighting on one corpus fails on another.\n\nReciprocal rank fusion sidesteps this by ignoring scores entirely and using only rank position. Each document gets a contribution based on where it placed in each result list, and those contributions sum. A document ranked highly by both methods rises to the top; a document ranked highly by one and absent from the other still scores reasonably.\n\nThis is robust because rank is comparable across methods in a way raw score is not, and it requires almost no tuning. It is the sensible default, and the small constant it uses to damp the contribution of low ranks is one of the few parameters worth touching.\n\nAdd reranking on top when quality matters more than latency. Retrieve a broader candidate set with hybrid search, then rerank the top results with a cross-encoder that scores query and document together — the approach in [cross-encoder reranking](/blog/cross-encoder-reranking-2026).\n\n## Common mistakes\n\n- **Dense-only retrieval.** Fails on exact matches in a way users notice immediately.\n- **Score normalization for fusion.** Fragile across corpora; use rank fusion.\n- **Retrieving the same count from both methods and merging naively.** Fusion handles the combination; retrieve generously from each.\n- **Not measuring by query type.** Aggregate recall hides that identifier queries are failing.\n- **Keyword-only in a conversational product.** Users paraphrase, and lexical matching misses it.\n\n## FAQ\n\n**Do I need two separate systems?**\nIncreasingly not. Most vector databases and search engines now support both retrieval modes in one system with fusion built in.\n\n**How much does hybrid improve recall?**\nIt varies by corpus and query mix, and it is typically one of the larger single improvements available in a retrieval pipeline, particularly where identifiers and proper nouns are common.\n\n**Is BM25 specifically required?**\nIt is the well-tested default for lexical scoring. Alternatives exist, and the important part is having a lexical channel at all.\n\n**Does hybrid slow retrieval down?**\nTwo searches instead of one, usually run in parallel. The added latency is small relative to generation.\n\n## Where to go next\n\nFor the middle ground, read [sparse embeddings explained](/blog/sparse-embeddings-explained-2026). For improving the final ordering, [cross-encoder reranking](/blog/cross-encoder-reranking-2026), and for measuring the gain, [RAG evaluation metrics](/blog/rag-evaluation-metrics-2026).","hue":209,"metaTitle":"Hybrid Search Explained: BM25 Plus Vectors 2026","metaDescription":"Why dense retrieval misses exact matches, how BM25 keyword search complements it, and how reciprocal rank fusion combines the two reliably.","keywords":["hybrid search bm25","dense vs sparse retrieval","reciprocal rank fusion","keyword search embeddings","exact match retrieval","lexical semantic search","rag retrieval quality","search relevance tuning","information retrieval 2026"],"tldr":["**Dense retrieval matches meaning; keyword search matches tokens** — they fail on opposite kinds of query.","**Exact identifiers, codes, and rare names are where embeddings fall down** — and where keyword search is trivially correct.","**Fusion by rank is more robust than fusion by score** — scores from the two methods are not comparable.","**Hybrid nearly always beats either alone** — it is one of the highest-return changes in a retrieval system.","**Skip:** replacing keyword search with embeddings entirely. You lose exact matching and users notice immediately."],"readTime":"3 min read","wordCount":705},"related":[{"slug":"semantic-search-vs-keyword-search-2026","title":"Semantic search vs keyword search in 2026: which to use","excerpt":"Keyword search matches words; semantic search matches meaning. Here is the 2026 guide to how each works, where each wins, and why hybrid search usually beats picking one.","category":"ai","date":"June 30, 2026","author":"ByteLedger Team","readTime":"3 min read","hue":240},{"slug":"sparse-embeddings-explained-2026","title":"Sparse Embeddings: Keyword Search That Learned Semantics","excerpt":"Learned sparse retrieval produces vectors over vocabulary terms with model-assigned weights. Here is how it bridges keyword and dense search, and where it fits.","category":"ai","date":"July 26, 2026","author":"ByteLedger Team","readTime":"3 min read","hue":216},{"slug":"rank-fusion-explained-2026","title":"Rank Fusion: Combining Search Results That Do Not Compare","excerpt":"Vector similarity and keyword scores live on incomparable scales. Fusing by rank position rather than score sidesteps the problem and needs no tuning.","category":"ai","date":"January 8, 2026","author":"ByteLedger Team","readTime":"4 min read","hue":215}],"sameCategory":[{"slug":"agent-cost-attribution-2026","title":"Agent Cost Attribution: Finding Where the Tokens Went","excerpt":"A single monthly API bill tells you that agents are expensive. It does not tell you which feature, which customer, or which retry loop is responsible. That gap is fixable.","category":"ai","date":"August 19, 2026","author":"ByteLedger Team","readTime":"5 min read","hue":220},{"slug":"human-in-the-loop-agents-2026","title":"Human-in-the-Loop Agents: Where to Put the Approval Gate","excerpt":"Approve everything and the agent is a slow autocomplete. Approve nothing and you have handed irreversible actions to a system that can be talked into things.","category":"ai","date":"August 19, 2026","author":"ByteLedger Team","readTime":"5 min read","hue":197},{"slug":"reasoning-effort-controls-2026","title":"Reasoning Effort Controls: Tuning How Hard a Model Thinks","excerpt":"Fixed thinking budgets gave way to effort levels, and the default is rarely the right setting. Here is how the dial behaves and where each level actually belongs.","category":"ai","date":"August 19, 2026","author":"ByteLedger Team","readTime":"5 min read","hue":210},{"slug":"retrieval-metrics-explained-2026","title":"Retrieval Metrics: Measuring the Half of RAG That Fails","excerpt":"When a RAG system answers badly, the retrieval usually failed before the model ever spoke. Measuring generation quality alone hides that entirely.","category":"ai","date":"August 19, 2026","author":"ByteLedger Team","readTime":"5 min read","hue":215}],"newer":{"slug":"gc-tuning-jvm-2026","title":"JVM GC Tuning: Start With the Collector, Not the Flags","excerpt":"Most JVM garbage collection tuning is flag cargo-culting. Here is how to pick a collector, what to measure, and why heap size is usually the real lever.","category":"code","date":"July 25, 2026","author":"ByteLedger Team","readTime":"4 min read","hue":150},"older":{"slug":"hyde-retrieval-explained-2026","title":"HyDE Retrieval: Searching With an Imagined Answer","excerpt":"HyDE generates a fake answer and searches with that instead of the question. Here is why the trick works, when it beats ordinary retrieval, and its failure mode.","category":"ai","date":"July 25, 2026","author":"ByteLedger Team","readTime":"3 min read","hue":214}}