use semstore::{Embedder, Error, SemanticIndex};
use serde_json::json;
struct RandomEmbedder {
dims: usize,
}
impl Embedder for RandomEmbedder {
fn embed(&self, text: &str) -> Result<Vec<f32>, Error> {
let seed = text
.bytes()
.fold(0u64, |acc, b| acc.wrapping_mul(31).wrapping_add(b as u64));
let v: Vec<f32> = (0..self.dims)
.map(|i| {
let x = seed.wrapping_mul(i as u64 + 1).wrapping_add(0xdeadbeef);
(x as f32 / u64::MAX as f32) * 2.0 - 1.0
})
.collect();
let norm = v.iter().map(|x| x * x).sum::<f32>().sqrt();
Ok(v.iter().map(|x| x / norm).collect())
}
fn dimensions(&self) -> usize {
self.dims
}
}
fn main() -> semstore::Result<()> {
let embedder = RandomEmbedder { dims: 256 };
let mut idx = SemanticIndex::builder()
.embedder(embedder)
.threshold(0.50)
.build()?;
idx.insert_batch([
("custom embedder — first entry", json!({ "id": 1 })),
("custom embedder — second entry", json!({ "id": 2 })),
("something completely different", json!({ "id": 3 })),
])?;
let results = idx.search("custom embedder", 3)?;
println!("Results for \"custom embedder\":");
for r in &results {
println!(
" [{:.3}] {} (metadata: {})",
r.score, r.content, r.metadata
);
}
Ok(())
}