Skip to content

Features

The product is a search database: ranked full-text search, filters, facets, and a default that avoids an empty page. Ranked full-text search, filters, sorts, and facets run as library code in persia-engine, over a collection snapshot. There is no Db to open yet (M10). Relaxation is not started (M8), so a search that matches nothing returns no hits. The write path is in progress (M6, 49/58). The table says which milestone builds each row. The long form, including the schema sketch and the relaxation JSON, is the feature reference. How a typo is supposed to avoid an empty page is Typo-tolerant search.

Capability Status
Open a file and search Not started (M10). Below it, persia_engine::db::Database opens a file and CollectionViews::search searches it.
Query text, filters, and BM25F Library code (M7 in progress, 46/51): the compiler, the filter DSL, and the scorer return ranked hits through CollectionViews::search.
Matching, facets, and sort Library code (M7 in progress, 46/51): matching, sorts, pages, and facets.
Zero-results relaxation Not started (M8). On by default in the design.
Schema and documents Done as library code (M3). Not reachable through Db.
Analyzers Done as library code (M4): standard, keyword, whitespace, en, es, pt, fr, de, it. The query compiler runs them.
Segment writer and reader Done (M5, 48/48). Segments are searched through CollectionViews::search.
Crash-safe commit and recovery Container commit is done (M2, 46/46). The document write path is in progress (M6, 49/58): WAL, flush, commit, and snapshots, deletes and upserts, and segment merging. Open and recovery orchestration is done (single-writer enforcement, persia verify, and the crash-loop harness). A collection snapshot can be searched as library code. There is no search call on the database handle.
Blob storage Not started (M9; its dependencies are done).
gRPC and HTTP server Not started (M11).
S3, GCS, Azure, replication Not started (M12).
Kubernetes and sharding Not started (M13).
Embedded Go and TypeScript bindings Planned (after M10). Design only.
Rust and Go network SDKs Not started (M14).
Integer codecs and None / Zstd block codecs Done (M1, 53/53). Library code in persia-format.

When a query matches nothing, the design walks a cascade and stops at the first level that returns enough hits. Stricter levels rank above looser ones. The response says what changed. Filters stay strict unless the caller opts in.

╔═ relaxation ═════════════════════════════════════════════════════╗ 
║    ┏━━━━━━━━━━━━━━━━┓                                            ║░
║    ┃ L0 exact       ┃   every term required                      ║░
║    ┗━━━━━━━━━━━━━━━━┛                                            ║░
║             ▼                                                    ║░
║    ┏━━━━━━━━━━━━━━━━┓                                            ║░
║    ┃ L1 synonyms    ┃   expand groups                            ║░
║    ┗━━━━━━━━━━━━━━━━┛                                            ║░
║             ▼                                                    ║░
║    ┏━━━━━━━━━━━━━━━━┓                                            ║░
║    ┃ L2 drop terms  ┃   100, 75, 50, 1                           ║░
║    ┗━━━━━━━━━━━━━━━━┛                                            ║░
║             ▼                                                    ║░
║    ┏━━━━━━━━━━━━━━━━┓                                            ║░
║    ┃ L3 prefix      ┃   capped expansions                        ║░
║    ┗━━━━━━━━━━━━━━━━┛                                            ║░
║             ▼                                                    ║░
║    ┏━━━━━━━━━━━━━━━━┓                                            ║░
║    ┃ L4 fuzzy       ┃   edit distance 1 or 2                     ║░
║    ┗━━━━━━━━━━━━━━━━┛                                            ║░
║             ▼                                                    ║░
║    ┏━━━━━━━━━━━━━━━━┓                                            ║░
║    ┃ L5 fallback    ┃   static rank, or none                     ║░
║    ┗━━━━━━━━━━━━━━━━┛                                            ║░
╚══════════════════════════════════════════════════════════════════╝░
 ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
The cascade in SPEC §7.6. Stop at the first level with enough hits. A stricter level ranks above a looser one. Filters stay as written unless relax.filters is last_resort. The full table is in the feature reference. What is implemented, and what is still the design, is typo-tolerant search.

Out of scope for v1: text extraction and OCR, vector search, SQL and joins, more than one writer on a shard, and encryption inside the file format. Those are SPEC §1.2.

Feature referenceHow it works