semstore/lib.rs
1//! # semstore
2//!
3//! Local semantic search for Rust applications — store text, search by meaning.
4//! No cloud required. Embeddings run on-device via ONNX (BGE-Small, ~23 MB).
5//!
6//! ## Features
7//!
8//! | Feature | Default | Description |
9//! |---------|---------|-------------|
10//! | `default-embedder` | ✓ | Bundles BGE-Small-EN-v1.5 via fastembed |
11//! | `bundled-sqlite` | ✓ | Statically links SQLite (no system lib needed) |
12//!
13//! Disable `default-embedder` to bring your own model via the [`Embedder`] trait.
14//!
15//! ## Quick start
16//!
17//! ```no_run
18//! use semstore::SemanticIndex;
19//! use serde_json::json;
20//!
21//! let mut idx = SemanticIndex::open("./index.db")?;
22//!
23//! idx.insert("Rust ownership prevents data races at compile time",
24//! json!({ "lang": "rust" }))?;
25//! idx.insert("Python uses reference counting for memory management",
26//! json!({ "lang": "python" }))?;
27//!
28//! let results = idx.search("memory safety", 3)?;
29//! for r in &results {
30//! println!("[{:.2}] {}", r.score, r.content);
31//! }
32//! # Ok::<(), semstore::Error>(())
33//! ```
34//!
35//! ## Custom embedder
36//!
37//! ```no_run
38//! use semstore::{Embedder, Error, SemanticIndex};
39//! use serde_json::json;
40//!
41//! struct OpenAiEmbedder { /* your fields */ }
42//!
43//! impl Embedder for OpenAiEmbedder {
44//! fn embed(&self, text: &str) -> Result<Vec<f32>, Error> {
45//! // call OpenAI /v1/embeddings …
46//! Ok(vec![0.0; 1536])
47//! }
48//! fn dimensions(&self) -> usize { 1536 }
49//! }
50//!
51//! let mut idx = SemanticIndex::builder()
52//! .embedder(OpenAiEmbedder { /* … */ })
53//! .path("./index.db")
54//! .build()?;
55//! # Ok::<(), semstore::Error>(())
56//! ```
57
58#![warn(missing_docs)]
59#![forbid(unsafe_code)]
60#![warn(clippy::all)]
61
62mod embedder;
63mod error;
64mod index;
65mod store;
66
67pub use embedder::Embedder;
68pub use error::{Error, Result};
69pub use index::{Builder, SearchResult, SemanticIndex, Stats};
70
71#[cfg(feature = "default-embedder")]
72pub use embedder::BgeEmbedder;