Book: RAG Pocket Guide: Retrieval, Chunking, and Reranking Patterns for Production Also by me: Thinking in Go (2-book series) — Complete Guide to Go Programming + Hexagonal Architecture in Go My project: Hermes IDE | GitHub — an IDE for developers who ship with Claude Code and other AI coding tools Me: xgabriel.com | GitHub You watched a team ship a RAG service for an internal code-search tool. Two weeks of work, a $180 embedding bill against a 14k-document corpus. Then someone typed ERR_TLS_CERT_ALTNAME_INVALID into the search box and got back five chunks about TLS in general, none of them the runbook with that exact string in the title. The runbook ranked 31st. The cosine search smeared the error code into a neighborhood of TLS prose. You know what fixes that. A to_tsvector column, a GIN index, ten lines of SQL, zero embedding cost. The same query lands the runbook at rank one. So the question is not whether BM25 still works. The question is when it is the only retriever you actually need.…