Infino Blog: engineering notes and case studies
cat blog/featured
ls blog/engineering/
- How a full-text and vector index fits inside a valid Parquet file The byte layout: BM25 and vector indexes between the last row group and a rewritten footer, still readable by DuckDB.
- Why we added a search index to Parquet instead of designing a new format Columnar formats are bad at search, so we added an index layer instead of replacing Parquet, including where that hurts.
- How we built the engine: files, manifests, and stateless compute Files, immutable manifests, and stateless compute: how the engine is assembled over object storage.
- How full-text, BM25, and vector search actually work Inverted indexes, BM25, IVF, and rank fusion, explained through how we actually built them.
- Making S3 the source of truth: the tricks that are not in the docs Two-GET opens, a one-CAS commit, and a cache that drops RAM but keeps the file on disk.
- Lessons from building a search engine in Rust Why tokio drives I/O and rayon drives CPU, and the 3x to 10x cold-search regression that taught us the rule.
- We swapped Solr out of a real search app. Here are the numbers. BM25 + vectors + facets from one Parquet file, including where Solr still wins.
ls blog/case-studies/
- License-usage analytics for a design-automation startup A design-automation startup puts 20 years of manual EDA license analysis into queryable form.
- Product analytics at 25 billion events a day Why a large consumer mobile app is indexing its event stream in place on S3.
- A canonical people index for legal-tech How a legal-tech company models a canonical people index on hybrid search.
- A staging area for thirty years of court records A government records modernization uses Infino as the enrichment layer between two systems of record.