We swapped Solr out of a real search app. Here are the numbers.

· engineering

We took Daniel Tunkelang’s open-source job-search application, a real app with keyword search, semantic search, facets, more-like-this, and resume-to-jobs matching, running on Solr, and changed exactly one thing: the retrieval engine. Same UX, same queries, same corpus. ~81,500 job postings from 13 sources.

Every retrieval feature now runs against one Apache Parquet file that holds the columnar data, the BM25 index, and the vector index side by side, on object storage. We verified the file still opens as plain Parquet in DuckDB and pandas.

What mapped to what

  • keyword search → bm25_search()
  • semantic search → vector_search() over e5-small-v2 embeddings
  • hybrid → reciprocal-rank fusion of both
  • facets → query_sql() with GROUP BY
  • more-like-this and resume→jobs matching → vector search over the same file

Measured, both directions

  • Dense recall@10: 0.923 vs 0.884, Infino ahead on semantic retrieval quality.
  • Index size: 509 MB vs 650 MB, ~22% smaller for the same corpus, columnar data included.
  • Warm latency: Solr wins. BM25 9 ms vs 3 ms, vector 8 ms vs 3 ms. Solr is an always-on server with everything resident in RAM; Infino is reading a file that lives on object storage. That’s the trade we chose, you pay a few milliseconds warm and get back the cluster, the second copy of your data, and the idle-time bill.
  • Result overlap: dense results agree 0.78 across engines; BM25 agrees only 0.11, Infino currently does no stemming or stopword removal, so lexical rankings genuinely differ. If your relevance tuning is Solr-analyzer-shaped, plan for that.
  • The SQL table-function path adds ~70 ms of planning overhead per query today; the native APIs don’t.

Why this test

Benchmarks on synthetic corpora tell you about the engine. Swapping the engine under a working application tells you about the integration: whether facets, filters, hybrid ranking, and "find me more like this one" all survive contact with one file format. They did, and the failure notes turned into ten GitHub issues.

The app is open source; the corpus is public job postings. We’re scaling the same setup past 1M postings next.