weavatrix_search_vector/
exact.rs1use crate::config::IndexConfig;
2use crate::error::SearchError;
3use crate::hit::SearchHit;
4use crate::parallel;
5use crate::vector::VectorStore;
6use std::sync::Arc;
7
8#[derive(Debug)]
10pub struct ExactIndex {
11 config: IndexConfig,
12 vectors: Arc<VectorStore>,
13}
14
15impl ExactIndex {
16 pub fn build(config: IndexConfig, vectors: &[(u64, &[f32])]) -> Result<Self, SearchError> {
22 config.validate()?;
23 let vectors = Arc::new(VectorStore::build(
24 config.dimensions,
25 config.metric,
26 vectors,
27 )?);
28 Ok(Self { config, vectors })
29 }
30
31 #[must_use]
32 pub fn len(&self) -> usize {
33 self.vectors.len()
34 }
35
36 #[must_use]
37 pub fn is_empty(&self) -> bool {
38 self.vectors.is_empty()
39 }
40
41 #[must_use]
42 pub const fn dimensions(&self) -> usize {
43 self.config.dimensions
44 }
45
46 pub fn search(&self, query: &[f32], count: usize) -> Result<Vec<SearchHit>, SearchError> {
52 self.vectors.exact(query, count)
53 }
54
55 pub fn search_batch(
63 &self,
64 queries: &[&[f32]],
65 count: usize,
66 ) -> Result<Vec<Vec<SearchHit>>, SearchError> {
67 parallel::search_batch(queries, self.config.query_threads, |query| {
68 self.search(query, count)
69 })
70 }
71}