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. |
Zero-results relaxation
Section titled “Zero-results relaxation”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 ║░ ║ ┗━━━━━━━━━━━━━━━━┛ ║░ ╚══════════════════════════════════════════════════════════════════╝░ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
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.