Sparse and Dense Are One Spectrum, Not Two Camps
BM25, SPLADE and dense embeddings sit on one axis. What moves along it is how much vocabulary survives compression, which is why a rare identifier ranks below three passages that never mention it.

Ask a dense retriever for "error code E-4042 on the XR-9 valve" and it happily returns passages about valves, errors and hardware faults. Semantically adjacent, lexically wrong. The one document containing the literal string can rank below three that never mention it.
That's not a bug in the model. Compress a passage into a single 1024-dimensional vector and you keep its gist. You lose the guarantee that any specific token survives.
Sparse and dense get talked about as two camps. They're one axis, and what moves along it is how much vocabulary survives compression.
BM25 sits at one end. One dimension per vocabulary term, no expansion at all. It scores by summing term frequency, inverse document frequency and a length normalisation over each query term. The formula matters less than the property: the literal term has to appear.
SPLADE sits in the middle, and this is the part most people skip. It's still a sparse vector over the same roughly 30,000-term vocabulary, almost all implicitly zero. The difference is that a model assigns the weights and adds expansion terms the document never wrote. So "valve" can be weighted into a document that only said "spool". You pay a model forward pass at index and query time, and longer postings lists than raw BM25.
Dense sits at the far end. One fixed-length vector, nothing in it corresponding to a term. That's exactly what lets it match paraphrase and cross-language, and exactly what loses the rare identifier.
Published hybrid systems routinely report recall gains in the 15 to 30 percent range over dense-only on mixed workloads. The gain isn't spread evenly. It concentrates on rare-term queries, which is the same place dense search fumbles.
Before deciding, pull a hundred of your real queries and count how many contain a token that has to match exactly. That number tells you where on this axis you need to sit. A benchmark won't.
mxp.co/d/sparse-vs-dense
[image: sparse-vs-dense.png]
Where this diagram appears
Run this on your own data
Mixpeek turns video, images, audio, and documents in your object storage into searchable, timestamped results through one API.
Search your own data
