Your vector search can’t find ERR_2041. Your keyword search can’t find “the thing that makes the
page load slowly” when the document says “latency.”
Neither retriever is broken. They are matching different things — one compares terms, the other compares meaning — and each one is blind precisely where the other sees. Most production retrieval problems are a query landing in one of those blind spots.
This site is about running both and merging the results. What lexical search finds that embeddings miss, and the reverse. How to fuse two ranked lists when their scores aren’t comparable. When a reranker is worth the latency it costs. And, when a query comes back with nothing useful, how to work out which of the two signals let you down — because the fix is different depending on the answer.
No winner is declared here. Every post shows the same query run through both retrievers, with both ranked lists side by side, because claims about retriever behaviour are cheap to make and easy to check.
Latest posts
-
What vector search misses
Identifiers, rare terms, negation and exact phrases. Five query classes where embeddings return plausible neighbours instead of the document you asked for.
-
What keyword search misses
Vocabulary mismatch: when the user's words and the document's words don't overlap, term scoring has nothing to score. Where stemming stops helping.
-
Fusing two ranked lists
BM25 scores and cosine similarities aren't on the same scale. Reciprocal rank fusion, score normalisation, and what each method throws away.
-
When a reranker earns its latency
A cross-encoder reads the query and passage together, which is why it ranks better and costs more. Where it belongs, what to feed it, and when to skip it.
-
Which signal failed
A query returned nothing useful. A procedure for finding whether lexical missed, dense missed, fusion buried it, or the document was never indexed.