Retrieval experiment / August 2026

The claim held, the fix didn't

A viral claim about search, tested on 5,376 of my own notes. Keyword beat semantic exactly where predicted. Then both of the obvious next moves turned out to be wrong.

The claim came from a short video by Isaac Flath, who builds retrieval systems for a living: for technical questions, plain keyword search beats semantic search. Ask for an exact thing, a filename, a paper ID, a config parameter, and matching words wins. Ask a fuzzy conceptual question and embeddings win. Treating your whole knowledge base as one corpus with one retriever means picking wrong for half your queries.

This is a checkable claim, and the published benchmarks back the first half: lexical search is stubbornly hard to beat on rare exact terms. But benchmark corpora are not my corpus. My notes are a deliberately messy pile: session logs, project notes, config gotchas, 3,485 podcast summaries, 675 paper summaries. So instead of sharing the video, I spent an afternoon testing it.

Corpus
5,376
Questions
10 + 10
Retrievers
3
Cloud calls
0
Time
~1 hr

The design mirrors the claim. Ten questions contain an exact identifier I know lives in my notes: a script name, a database table, a parameter like max_df_ratio, an arXiv number, a version pin. Ten are conceptual paraphrases with none of the target document's vocabulary. Every question has a verified answer set, so scoring is mechanical: Recall@10 asks whether a right document shows up in the top ten, and MRR rewards it being near the top. Three retrievers ran every question: keyword search (BM25), a local embedding model, and the standard blend of both rankings.

01 The claim held

First run, n=10 per stratum
question typeretrieverRecall@10MRR@10
exact identifierkeyword0.800.581
exact identifiersemantic0.500.370
exact identifierblend0.600.395
conceptualkeyword0.900.783
conceptualsemantic0.800.714
conceptualblend1.000.824

Semantic search lost half the identifier questions outright, and its misses are instructive. Asked about a health database column, it returned sleep podcasts. Asked about a specific arXiv number, it returned papers that felt thematically nearby. Embeddings compress meaning, and an identifier's meaning is not the point of an identifier. Its exactness is.

On conceptual questions the two modes were close, which also matches the claim. So far the video is two for two. The surprises were in what I assumed would follow.

02 Wrong assumption one: blending fixes it

The textbook resolution is hybrid retrieval: run both, merge the rankings, get the best of each. The merge I used is the standard one, reciprocal rank fusion, which rewards documents that rank well on either list.

On identifier questions the blend was worse than keyword alone: 0.60 recall against 0.80. The mechanism is blunt. When one ranking is confidently right and the other is confidently wrong, averaging them drags the right answer down. The arXiv question is the clean example: keyword search had the correct document at rank one, and fusing in the semantic ranking pushed it out of the top ten entirely.

A blend is not a safety net. When one retriever is reliably bad on a question type, fusion does not dilute its badness, it spends it against your good retriever's wins.

03 Wrong assumption two: keyword's misses were keyword's fault

Keyword search still missed two identifier questions, which looked like the ceiling of the approach. It was not. It was a tokenizer bug, and a common one.

My indexer split text on anything that was not a letter or digit, the usual default. That turns max_df_ratio into three tokens: max, df, ratio. Each is common. The identifier's entire value, its rarity, evaporates at the first step of indexing. The top result for that question was a document containing zero occurrences of the identifier and plenty of the fragments. Same story for a table name of the user_something_keys shape: three ordinary words, none rare.

The fix is one line: keep joined identifiers as whole tokens alongside their fragments. That alone moved keyword search to 0.90 recall on identifiers and a clean sweep on conceptual questions.

Keyword search, before and after the tokenizer fix
question typetokenizerRecall@10MRR@10
exact identifierdefault split0.800.581
exact identifieridentifiers kept whole0.900.761
conceptualdefault split0.900.783
conceptualidentifiers kept whole1.000.794

This inverts the diagnosis. What looked like evidence for needing a second retrieval mode was mostly evidence that the first one was quietly destroying its own best signal.

04 What routing is actually worth

The video's implied architecture is a router: send each query to the retrieval mode that suits it. That turns out to be almost embarrassingly cheap to build. A regular expression that looks for identifier-shaped tokens, things with underscores, hyphens, dots, or camelCase, classified all twenty questions correctly. No model in the loop. The two question populations separate on surface shape alone.

All 20 questions, fixed tokenizer everywhere
configurationRecall@10MRR@10
semantic everywhere0.650.542
blend everywhere0.800.675
keyword everywhere0.950.778
routed: identifiers to keyword, rest to blend0.950.793

Routing is the best configuration, and it recovers every keyword win that blind fusion destroyed. But the honest reading of that table is the gap between the last two rows: plus 0.015 MRR, at twenty questions, is noise. Fixed keyword search alone captures nearly everything.

So the deployment rule I actually took away: fix tokenization first, because it is free and load-bearing. Add routing and a blend only if you already maintain an embedding index for other reasons. Never fuse blindly.

The limits, stated plainly: twenty questions is a probe, not a benchmark. I wrote both the questions and the answer sets, and the identifier stratum is keyword-favorable by construction, since a correct document is one that contains the identifier. The probe measures each mode's failure pattern, not a fair horse race. The direction is clear at this size; the decimals are not.