A basic vector database for Rust with multiple similarity engines and ONNX-powered embedding generation.
Rust
0
2 commits
updated Oct 21, 2025
A basic vector database for Rust with multiple similarity engines and ONNX-powered embedding generation.
.based_vector/ directoryAdd to your Cargo.toml:
[dependencies]
based_vector = "0.1"
Or install the CLI:
cargo install based_vector
# Create a new database in the current directory
based_vector init
# Or specify similarity method
based_vector init --method mlp
# Insert a document
based_vector insert --text "Your document text here"
# Insert with metadata
based_vector insert \
--text "Rust is a systems programming language" \
--metadata category=programming \
--metadata language=rust
# Basic search (default top-5)
based_vector search --query "programming languages"
# Search with specific top-k
based_vector search --query "programming languages" --top-k 10
# Search with threshold (returns all results above threshold)
based_vector search --query "rust" --threshold 0.7
# Combine threshold + top-k (at most 10 results with score >= 0.7)
based_vector search --query "rust" --top-k 10 --threshold 0.7
# JSON output
based_vector search --query "rust" --format json
# List entries
based_vector list --limit 10
# Show statistics
based_vector stats
# Delete an entry
based_vector delete --id <entry-id>
# Export to JSON
based_vector export --output backup.json
# Import from JSON
based_vector import --input backup.json
use based_vector::{Db, Document, Embeddable};
use based_vector::embedder::OnnxEmbedder;
use based_vector::cosine::CosineSimilarityEngine;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Initialize ORT with quiet logging (optional but recommended)
based_vector::init_ort_quiet();
// Create a new database
let mut db: Db<Document> = Db::new();
// Initialize embedder (downloads model on first run)
let mut embedder = OnnxEmbedder::new()?;
embedder.initialize().await?;
// Insert documents
let doc1 = Document::new("Rust is a systems programming language");
let embedding1 = embedder.embed_mut(&doc1.embedding_text())?;
db.insert_with_embedding(doc1, embedding1)?;
let doc2 = Document::new("Python is great for data science");
let embedding2 = embedder.embed_mut(&doc2.embedding_text())?;
db.insert_with_embedding(doc2, embedding2)?;
// Search
let query = "programming languages";
let query_embedding = embedder.embed_mut(query)?;
let engine = CosineSimilarityEngine::new();
// Top-K search
let results = db.search(&query_embedding, 5, &engine)?;
for result in results {
println!("Score: {:.4}, Text: {}", result.score, result.entry.data.text);
}
// Or threshold-based search (all results above 0.7 similarity)
let threshold_results = db.search_with_threshold(&query_embedding, 0.7, &engine)?;
println!("Found {} results above threshold", threshold_results.len());
// Save to disk
db.save(None::<&str>)?;
Ok(())
}
You can use custom types by implementing the Embeddable trait:
use based_vector::{Db, Embeddable};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
struct Article {
title: String,
content: String,
author: String,
}
impl Embeddable for Article {
fn embedding_text(&self) -> String {
// Decide what text to embed
format!("{}\n\n{}", self.title, self.content)
}
}
fn main() {
let mut db: Db<Article> = Db::new();
// Use db with Articles...
}
embedder: ONNX-based embedding generation with Hugging Face modelscosine: Cosine similarity engine (fast, lightweight)mlp: MLP-based learned similarity (requires trained ONNX model)storage: File-backed persistence with atomic writesquery: Search and filtering functionalityconfig: Configuration and builder patternsThe database is stored in a .based_vector/ directory:
.based_vector/
├── entries.bin # Serialized entries (bincode)
├── config.json # Database metadata
└── index.bin # Optional index structures (future)
The default model is sentence-transformers/all-MiniLM-L6-v2 (384 dimensions).
Supported models:
sentence-transformers/all-MiniLM-L6-v2 (default)sentence-transformers/all-mpnet-base-v2sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2sentence-transformers/distiluse-base-multilingual-cased-v2Models are cached in ~/.cache/based_vector/models/ (or OS equivalent).
To use MLP-based similarity, you need a trained ONNX model. The model should:
Place your model at ~/.cache/based_vector/models/similarity_mlp.onnx or specify a custom path.
# Build
cargo build --release
# Run tests
cargo test
# Run with verbose logging (both app and ONNX Runtime)
RUST_LOG=debug ORT_LOG_LEVEL=1 cargo run -- search --query "test"
# App verbose, ORT quiet (default)
RUST_LOG=debug cargo run -- search --query "test"
By default, based_vector attempts to suppress verbose ONNX Runtime logs by setting ORT_LOG_LEVEL=3 (Error level).
If you still see verbose ORT logs, set the environment variable before running:
# Windows (PowerShell)
$env:ORT_LOG_LEVEL="3"
based_vector search --query "test"
# Windows (CMD)
set ORT_LOG_LEVEL=3
based_vector search --query "test"
# Linux/macOS
export ORT_LOG_LEVEL=3
based_vector search --query "test"
# Or inline
ORT_LOG_LEVEL=3 based_vector search --query "test"
ORT_LOG_LEVEL values:
0 = Verbose (very noisy - shows all optimization steps)1 = Info (shows hardware detection, graph transformations)2 = Warning3 = Error (default - quiet)4 = Fatal (completely silent)To see ONNX details for debugging:
ORT_LOG_LEVEL=1 based_vector search --query "test"
MIT OR Apache-2.0
Contributions welcome! Please open an issue or PR.
2 commits
Rust
100.0%
A basic vector database for Rust with multiple similarity engines and ONNX-powered embedding generation.
Rust
0
2 commits
updated Oct 21, 2025
A basic vector database for Rust with multiple similarity engines and ONNX-powered embedding generation.
.based_vector/ directoryAdd to your Cargo.toml:
[dependencies]
based_vector = "0.1"
Or install the CLI:
cargo install based_vector
# Create a new database in the current directory
based_vector init
# Or specify similarity method
based_vector init --method mlp
# Insert a document
based_vector insert --text "Your document text here"
# Insert with metadata
based_vector insert \
--text "Rust is a systems programming language" \
--metadata category=programming \
--metadata language=rust
# Basic search (default top-5)
based_vector search --query "programming languages"
# Search with specific top-k
based_vector search --query "programming languages" --top-k 10
# Search with threshold (returns all results above threshold)
based_vector search --query "rust" --threshold 0.7
# Combine threshold + top-k (at most 10 results with score >= 0.7)
based_vector search --query "rust" --top-k 10 --threshold 0.7
# JSON output
based_vector search --query "rust" --format json
# List entries
based_vector list --limit 10
# Show statistics
based_vector stats
# Delete an entry
based_vector delete --id <entry-id>
# Export to JSON
based_vector export --output backup.json
# Import from JSON
based_vector import --input backup.json
use based_vector::{Db, Document, Embeddable};
use based_vector::embedder::OnnxEmbedder;
use based_vector::cosine::CosineSimilarityEngine;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Initialize ORT with quiet logging (optional but recommended)
based_vector::init_ort_quiet();
// Create a new database
let mut db: Db<Document> = Db::new();
// Initialize embedder (downloads model on first run)
let mut embedder = OnnxEmbedder::new()?;
embedder.initialize().await?;
// Insert documents
let doc1 = Document::new("Rust is a systems programming language");
let embedding1 = embedder.embed_mut(&doc1.embedding_text())?;
db.insert_with_embedding(doc1, embedding1)?;
let doc2 = Document::new("Python is great for data science");
let embedding2 = embedder.embed_mut(&doc2.embedding_text())?;
db.insert_with_embedding(doc2, embedding2)?;
// Search
let query = "programming languages";
let query_embedding = embedder.embed_mut(query)?;
let engine = CosineSimilarityEngine::new();
// Top-K search
let results = db.search(&query_embedding, 5, &engine)?;
for result in results {
println!("Score: {:.4}, Text: {}", result.score, result.entry.data.text);
}
// Or threshold-based search (all results above 0.7 similarity)
let threshold_results = db.search_with_threshold(&query_embedding, 0.7, &engine)?;
println!("Found {} results above threshold", threshold_results.len());
// Save to disk
db.save(None::<&str>)?;
Ok(())
}
You can use custom types by implementing the Embeddable trait:
use based_vector::{Db, Embeddable};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
struct Article {
title: String,
content: String,
author: String,
}
impl Embeddable for Article {
fn embedding_text(&self) -> String {
// Decide what text to embed
format!("{}\n\n{}", self.title, self.content)
}
}
fn main() {
let mut db: Db<Article> = Db::new();
// Use db with Articles...
}
embedder: ONNX-based embedding generation with Hugging Face modelscosine: Cosine similarity engine (fast, lightweight)mlp: MLP-based learned similarity (requires trained ONNX model)storage: File-backed persistence with atomic writesquery: Search and filtering functionalityconfig: Configuration and builder patternsThe database is stored in a .based_vector/ directory:
.based_vector/
├── entries.bin # Serialized entries (bincode)
├── config.json # Database metadata
└── index.bin # Optional index structures (future)
The default model is sentence-transformers/all-MiniLM-L6-v2 (384 dimensions).
Supported models:
sentence-transformers/all-MiniLM-L6-v2 (default)sentence-transformers/all-mpnet-base-v2sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2sentence-transformers/distiluse-base-multilingual-cased-v2Models are cached in ~/.cache/based_vector/models/ (or OS equivalent).
To use MLP-based similarity, you need a trained ONNX model. The model should:
Place your model at ~/.cache/based_vector/models/similarity_mlp.onnx or specify a custom path.
# Build
cargo build --release
# Run tests
cargo test
# Run with verbose logging (both app and ONNX Runtime)
RUST_LOG=debug ORT_LOG_LEVEL=1 cargo run -- search --query "test"
# App verbose, ORT quiet (default)
RUST_LOG=debug cargo run -- search --query "test"
By default, based_vector attempts to suppress verbose ONNX Runtime logs by setting ORT_LOG_LEVEL=3 (Error level).
If you still see verbose ORT logs, set the environment variable before running:
# Windows (PowerShell)
$env:ORT_LOG_LEVEL="3"
based_vector search --query "test"
# Windows (CMD)
set ORT_LOG_LEVEL=3
based_vector search --query "test"
# Linux/macOS
export ORT_LOG_LEVEL=3
based_vector search --query "test"
# Or inline
ORT_LOG_LEVEL=3 based_vector search --query "test"
ORT_LOG_LEVEL values:
0 = Verbose (very noisy - shows all optimization steps)1 = Info (shows hardware detection, graph transformations)2 = Warning3 = Error (default - quiet)4 = Fatal (completely silent)To see ONNX details for debugging:
ORT_LOG_LEVEL=1 based_vector search --query "test"
MIT OR Apache-2.0
Contributions welcome! Please open an issue or PR.
2 commits
Rust
100.0%