Hybrid search with RRF: why BM25 still matters in the age of embeddings
Keyword search never went away. Fusing it with dense retrieval fixes the recall problems that embeddings alone create on niche queries, with a surprisingly small amount of code.
When we built candidate search for a recruiting platform, pure vector search performed beautifully on broad queries like "backend engineer with cloud experience" and badly on the queries recruiters actually cared about: a specific certification, an uncommon framework, a niche domain. Embeddings smooth over exactly the specificity those queries depend on.
What BM25 gets right
BM25 rewards exact term matches and rare terms. If a recruiter searches for a specific tool name, the profiles that mention it rank first. That is precisely what dense retrieval struggles with, because the embedding of a rare token is noisy.
Reciprocal Rank Fusion
Run both retrievers, take each result's rank in each list, and score it as the sum of 1 / (k + rank), with k around 60. Documents that appear high in either list surface; documents that appear in both surface higher. No score normalisation, no tuning of weights, and it is robust across corpora.
Then rerank
Take the fused top 50 and rerank with a cross-encoder or an LLM judge for the final ordering. This is where semantic understanding earns its keep, on a candidate set that keyword search has already made complete.
Results
On the recruiting corpus, hybrid retrieval significantly improved recall on niche queries compared to either method alone, and the implementation was under a few hundred lines on top of PostgreSQL full-text search and pgvector. Before reaching for a new vector database, check whether the one you have can do both.
Notes from building AI in production
Let's build intelligent systems that drive growth
Tachyon is the engineering partner for teams that need AI in production, not in a deck. Start with a free 60-minute discovery call.