Hybrid search for RAG: why keyword and vector beat either alone
Hybrid search combines keyword matching with vector similarity because each fails where the other succeeds - vectors miss part numbers and rare names, keywords miss anything phrased differently from the query.
The two searches fail differently
Vector search places similar meanings near each other, so it finds a passage about refunds when you ask about getting your money back. It is poor at exact tokens: a part number, an error code, a surname or an internal acronym has no useful neighbourhood in embedding space. Keyword search is the mirror image - exact on those, blind to paraphrase.
Which one you need depends on the question
Corpora full of identifiers - support tickets, invoices, code, catalogues - lean keyword. Prose where the same idea is worded many ways - policies, research, meeting notes - leans vector. Most real corpora contain both, which is why running both and merging beats picking a side.
Merging is where it goes wrong
The two searches return incomparable scores, so they cannot simply be added. The usual approach ranks each list independently and combines by position rather than by score, which stops one system's confident number swamping the other's. Whatever the method, it needs testing on your own questions: the merge is a ranking decision, not a formatting one.
Know which kind of vector you actually have
Not everything called an embedding carries meaning. A bag-of-words hash vector gives fast exact-term overlap and no semantic similarity at all; a sentence-transformer gives meaning. Both are arrays of floats of the right shape, and a manifest that does not distinguish them lets a keyword index be mistaken for a semantic one. RAG Converter labels which it used, in the file and in the interface.
Chunking decides the ceiling for both
Neither search can retrieve a passage that was never formed correctly. A chunk mixing two columns, or one holding an entire document, limits hybrid search exactly as much as it limits either half. Fixing chunking is almost always cheaper than changing embedding model, and more often the actual problem.