Dense vector search is good at meaning. Ask about "a smart farming assistant" and it'll find a chunk about "an AI agribot for real-time guidance" even without a shared word. But it's bad at exact strings — a specific product SKU, an error code, a number — because those don't carry semantic meaning the way concepts do.
BM25 covers the gap
BM25 is decades-old keyword search, and it's still the right tool for exact-term matching. Run it alongside dense search, not instead of it.
Merging two ranked lists without breaking anything
The naive approach — averaging similarity scores from two different systems — breaks because the score scales aren't comparable. Reciprocal Rank Fusion (RRF) sidesteps this entirely: each chunk's fused score is the sum of `1 / (k + rank)` across every list it appears in. No normalisation needed, because rank position, not score magnitude, is what's being combined.
When hybrid retrieval actually matters
If your documents contain product names, version numbers, or specific figures a user might search verbatim, hybrid retrieval isn't optional — pure vector search will silently miss exact queries and you may never notice, because the wrong answer still sounds plausible.