use iqdb::{DistanceMetric, Iqdb, Result, Vector, VectorId};
fn build(metric: DistanceMetric) -> Result<Iqdb> {
let db = Iqdb::open_in_memory(2, metric)?;
db.upsert(VectorId::from(1u64), Vector::new(vec![1.0, 0.0])?, None)?;
db.upsert(VectorId::from(2u64), Vector::new(vec![0.0, 1.0])?, None)?;
db.upsert(VectorId::from(3u64), Vector::new(vec![2.0, 0.0])?, None)?;
Ok(db)
}
fn main() -> Result<()> {
let cosine = build(DistanceMetric::Cosine)?;
println!("-- cosine, top 3 --");
for hit in cosine.search(&Vector::new(vec![1.0, 0.0])?, 3)? {
println!(" id={} distance={:.4}", hit.id, hit.distance);
}
let euclid = build(DistanceMetric::Euclidean)?;
println!("-- euclidean, top 3 --");
for hit in euclid.search(&Vector::new(vec![1.0, 0.0])?, 3)? {
println!(" id={} distance={:.4}", hit.id, hit.distance);
}
let queries = vec![Vector::new(vec![1.0, 0.0])?, Vector::new(vec![0.0, 1.0])?];
println!("-- batch (cosine), top 1 each --");
for (i, hits) in cosine.search_batch(&queries, 1)?.into_iter().enumerate() {
println!(" query {i}: nearest id={}", hits[0].id);
}
cosine.close()?;
euclid.close()
}