pub struct VectorIndex { /* private fields */ }Expand description
In-memory vector index for fast similarity search
Uses HNSW (Hierarchical Navigable Small World) for approximate nearest neighbor search. This provides O(log n) search time instead of O(n) brute-force, making it 10-100x faster for large repositories (10K+ spans).
Implementations§
Source§impl VectorIndex
impl VectorIndex
Sourcepub fn build(spans: Vec<Span>) -> Self
pub fn build(spans: Vec<Span>) -> Self
Build an index from spans using HNSW
§Arguments
spans- Vector of spans with embeddings
§Returns
A new VectorIndex ready for searching
§HNSW Parameters
m: Maximum number of connections per node (16 = good balance of speed/quality)ef_construction: Size of candidate list during construction (200 = high quality)ef_search: Size of candidate list during search (50 = good balance)
These parameters provide >95% recall@50 while being 10-100x faster than brute-force.
Sourcepub fn search(
&self,
query_embedding: &[f32],
k: usize,
) -> Result<Vec<ScoredSpan>>
pub fn search( &self, query_embedding: &[f32], k: usize, ) -> Result<Vec<ScoredSpan>>
Search for similar spans using HNSW approximate nearest neighbor search
§Arguments
query_embedding- The query vectork- Number of results to return
§Returns
Vector of scored spans, sorted by relevance (highest score first)
§Performance
- O(log n) search time instead of O(n) brute-force
- 10-100x faster for large repositories (10K+ spans)
-
95% recall@k (quality maintained)
Sourcepub fn save_to_disk(&self, cache_dir: &Path) -> Result<()>
pub fn save_to_disk(&self, cache_dir: &Path) -> Result<()>
Save HNSW index to disk for persistence (Phase 2.1)
Saves both the HNSW graph structure and the spans metadata.
This allows instant loading on subsequent queries once hnsw_rs
supports owned loading; for now we only reload from cached spans.
§Arguments
cache_dir- Directory to save index files
§Returns
Ok(()) if successful
Sourcepub fn load_from_disk(cache_dir: &Path) -> Result<Option<Self>>
pub fn load_from_disk(cache_dir: &Path) -> Result<Option<Self>>
Load HNSW index from disk (Phase 2.1)
Note: Due to lifetime constraints in the hnsw_rs library, we cannot directly
load the HNSW structure from disk. Instead, we load cached spans and rebuild HNSW.
This is still faster than loading spans from SQLite, but not as fast as loading
the HNSW structure directly would be.
For large repositories (>10K spans), consider using server mode which keeps the index in memory across queries for optimal performance.
§Arguments
cache_dir- Directory containing index files
§Returns
Some(VectorIndex) if loaded successfully, None otherwise
Auto Trait Implementations§
impl Freeze for VectorIndex
impl !RefUnwindSafe for VectorIndex
impl Send for VectorIndex
impl Sync for VectorIndex
impl Unpin for VectorIndex
impl !UnwindSafe for VectorIndex
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more