use memvdb::{CacheDB, Distance, Embedding};
use std::collections::HashMap;
fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("🚀 MemVDB Basic Usage Example");
println!("===============================\n");
let mut db = CacheDB::new();
println!("✅ Created new MemVDB instance");
let collection_name = "documents".to_string();
let dimension = 384;
let distance_metric = Distance::Cosine;
db.create_collection(collection_name.clone(), dimension, distance_metric)?;
println!(
"✅ Created collection '{}' with {} dimensions using {:?} distance",
collection_name, dimension, distance_metric
);
let sample_documents = vec![
(
"doc1",
"Artificial Intelligence and Machine Learning",
vec![0.1, 0.2, 0.3],
),
(
"doc2",
"Deep Learning Neural Networks",
vec![0.15, 0.25, 0.35],
),
("doc3", "Cooking Recipes and Food", vec![0.8, 0.1, 0.05]),
("doc4", "Travel Guide to Europe", vec![0.05, 0.9, 0.1]),
(
"doc5",
"Machine Learning Algorithms",
vec![0.12, 0.22, 0.32],
),
];
println!("\n📝 Inserting sample documents...");
for (doc_id, title, mut vector) in sample_documents {
vector.resize(dimension, 0.0);
let mut id = HashMap::new();
id.insert("document_id".to_string(), doc_id.to_string());
let mut metadata = HashMap::new();
metadata.insert("title".to_string(), title.to_string());
metadata.insert(
"category".to_string(),
if title.contains("Learning") || title.contains("AI") {
"Technology".to_string()
} else if title.contains("Cooking") || title.contains("Food") {
"Food".to_string()
} else {
"Travel".to_string()
},
);
metadata.insert("indexed_at".to_string(), "2024-01-01".to_string());
let embedding = Embedding {
id,
vector,
metadata: Some(metadata),
};
db.insert_into_collection(&collection_name, embedding)?;
println!(" 📄 Inserted: {} - {}", doc_id, title);
}
let collection = db
.get_collection(&collection_name)
.ok_or("Collection not found")?;
println!("\n📊 Collection statistics:");
println!(" - Name: {}", collection_name);
println!(" - Dimension: {}", collection.dimension);
println!(" - Distance metric: {:?}", collection.distance);
println!(" - Number of embeddings: {}", collection.embeddings.len());
println!("\n🔍 Performing similarity search...");
let mut query_vector = vec![0.11, 0.21, 0.31]; query_vector.resize(dimension, 0.0);
println!("Query: Looking for AI/Machine Learning related documents");
let results = collection.get_similarity(&query_vector, 3);
println!("\n📋 Top 3 similar documents:");
for (rank, result) in results.iter().enumerate() {
let doc_id = result
.embedding
.id
.get("document_id")
.map(|s| s.as_str())
.unwrap_or("unknown");
let title = result
.embedding
.metadata
.as_ref()
.and_then(|m| m.get("title"))
.map(|s| s.as_str())
.unwrap_or("No title");
let category = result
.embedding
.metadata
.as_ref()
.and_then(|m| m.get("category"))
.map(|s| s.as_str())
.unwrap_or("Unknown");
println!(
" {}. Document: {} (Score: {:.4})",
rank + 1,
doc_id,
result.score
);
println!(" Title: {}", title);
println!(" Category: {}", category);
println!();
}
println!("🔍 Performing another search...");
let mut food_query = vec![0.75, 0.15, 0.1]; food_query.resize(dimension, 0.0);
println!("Query: Looking for food/cooking related documents");
let food_results = collection.get_similarity(&food_query, 2);
println!("\n📋 Top 2 food-related documents:");
for (rank, result) in food_results.iter().enumerate() {
let doc_id = result
.embedding
.id
.get("document_id")
.map(|s| s.as_str())
.unwrap_or("unknown");
let title = result
.embedding
.metadata
.as_ref()
.and_then(|m| m.get("title"))
.map(|s| s.as_str())
.unwrap_or("No title");
println!(
" {}. Document: {} (Score: {:.4})",
rank + 1,
doc_id,
result.score
);
println!(" Title: {}", title);
println!();
}
let all_embeddings = db.get_embeddings(&collection_name).unwrap();
println!("📚 All documents in collection:");
for embedding in all_embeddings {
let doc_id = embedding
.id
.get("document_id")
.map(|s| s.as_str())
.unwrap_or("unknown");
let title = embedding
.metadata
.as_ref()
.and_then(|m| m.get("title"))
.map(|s| s.as_str())
.unwrap_or("No title");
let category = embedding
.metadata
.as_ref()
.and_then(|m| m.get("category"))
.map(|s| s.as_str())
.unwrap_or("Unknown");
println!(" - {}: {} [{}]", doc_id, title, category);
}
println!("\n✅ Basic usage example completed successfully!");
println!("💡 Try modifying the query vectors or adding more documents to experiment further.");
Ok(())
}