use crate::config::IndexConfig;
use crate::error::SearchError;
use crate::hit::SearchHit;
use crate::parallel;
use crate::vector::VectorStore;
use std::sync::Arc;
#[derive(Debug)]
pub struct ExactIndex {
config: IndexConfig,
vectors: Arc<VectorStore>,
}
impl ExactIndex {
pub fn build(config: IndexConfig, vectors: &[(u64, &[f32])]) -> Result<Self, SearchError> {
config.validate()?;
let vectors = Arc::new(VectorStore::build(
config.dimensions,
config.metric,
vectors,
)?);
Ok(Self { config, vectors })
}
#[must_use]
pub fn len(&self) -> usize {
self.vectors.len()
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.vectors.is_empty()
}
#[must_use]
pub const fn dimensions(&self) -> usize {
self.config.dimensions
}
pub fn search(&self, query: &[f32], count: usize) -> Result<Vec<SearchHit>, SearchError> {
self.vectors.exact(query, count)
}
pub fn search_batch(
&self,
queries: &[&[f32]],
count: usize,
) -> Result<Vec<Vec<SearchHit>>, SearchError> {
parallel::search_batch(queries, self.config.query_threads, |query| {
self.search(query, count)
})
}
}