sift-core
Core engine for indexed code search. Build on-disk indexes over a codebase, then run regex or fixed-string queries with automatic candidate narrowing.
Index Architecture
The engine is built around composable indexes. Each index type independently narrows candidates for a query; the Indexes registry combines their results via set intersection. Today the shipped index type is a trigram index; the IndexKind and Index enums provide static dispatch for adding future index kinds (AST indexes, dependency graphs, vector indexes, etc.) without changing the query planner or search pipeline.
IndexKind::Trigram ──build/open/update──> Index::Trigram(TrigramIndex)
IndexKind::??? ──build/open/update──> Index::???(...)
│
Indexes registry
│
intersect candidate sets at query time
Modules
| Module | Description |
|---|---|
query/ |
Query description (QuerySpec), planning -- index-agnostic |
index/ |
IndexKind / Index enums, Indexes registry, IndexStore, snapshot persistence |
index/trigram/ |
Trigram index: build, load, search, and on-disk storage |
grep/ |
Pipeline orchestration: GrepRequest, run() |
search/ |
Regex execution, scanning, output formatting, parallelism |
lib.rs |
Public API re-exports, error types, constants |
API
use ;
// Build indexes (currently trigram; extensible to multiple kinds)
let mut store = open_or_create?;
store.build?;
// Open all indexes in the store
let indexes = open?;
// Search via the grep pipeline
let query = new?;
let run = GrepRequest
.run?;
SearchQuery compiles the regex once; repeated run calls reuse the compiled matcher and searcher cache.
Features
| Feature | Effect |
|---|---|
profile |
Enables sift-profile binary and tempfile dependency |
Testing
Unit tests are co-located with implementation files in #[cfg(test)] mod tests blocks. Integration tests live in tests/.
See benches/README.md for the full benchmark and profiling workflow.