pub struct HNSWIndex { /* private fields */ }Expand description
HNSW index for approximate nearest neighbor search.
Implementations§
Source§impl HNSWIndex
impl HNSWIndex
Sourcepub const fn with_config(config: HNSWConfig) -> HNSWIndex
pub const fn with_config(config: HNSWConfig) -> HNSWIndex
Create a new HNSW index with custom configuration.
Sourcepub fn with_instrumentation(config: HNSWConfig) -> HNSWIndex
pub fn with_instrumentation(config: HNSWConfig) -> HNSWIndex
Create an HNSW index with access instrumentation enabled.
Sourcepub const fn has_instrumentation(&self) -> bool
pub const fn has_instrumentation(&self) -> bool
Returns true if access instrumentation is enabled.
Sourcepub fn access_stats(&self) -> Option<HNSWStatsSnapshot>
pub fn access_stats(&self) -> Option<HNSWStatsSnapshot>
Returns access statistics snapshot if instrumentation is enabled.
Sourcepub fn insert(&self, vector: Vec<f32>) -> usize
pub fn insert(&self, vector: Vec<f32>) -> usize
Insert a vector into the index. Returns the assigned node ID.
Sourcepub fn insert_sparse(&self, sparse: SparseVector) -> usize
pub fn insert_sparse(&self, sparse: SparseVector) -> usize
Insert a sparse vector into the index. Returns the assigned node ID.
Sourcepub fn insert_auto(&self, vector: Vec<f32>) -> usize
pub fn insert_auto(&self, vector: Vec<f32>) -> usize
Insert a vector with automatic storage format selection.
Automatically chooses sparse storage when the vector has sparsity
above config.sparsity_threshold (default 50% zeros), otherwise
uses dense storage. This provides memory savings for high-sparsity
vectors without requiring manual format selection.
Sourcepub fn try_insert(
&self,
vector: Vec<f32>,
) -> Result<usize, EmbeddingStorageError>
pub fn try_insert( &self, vector: Vec<f32>, ) -> Result<usize, EmbeddingStorageError>
Try to insert a vector into the index.
§Errors
Returns Err(CapacityExceeded) if max_nodes limit is reached.
Sourcepub fn try_insert_sparse(
&self,
sparse: SparseVector,
) -> Result<usize, EmbeddingStorageError>
pub fn try_insert_sparse( &self, sparse: SparseVector, ) -> Result<usize, EmbeddingStorageError>
Try to insert a sparse vector into the index.
§Errors
Returns Err(CapacityExceeded) if max_nodes limit is reached.
Sourcepub fn insert_quantized(&self, vector: &[f32]) -> usize
pub fn insert_quantized(&self, vector: &[f32]) -> usize
Insert a vector with 8-bit scalar quantization.
Quantizes the vector to 8-bit precision before storage, achieving ~4x memory reduction compared to dense storage. The quantization preserves relative magnitudes using asymmetric min/max scaling.
§Trade-offs
- Memory: ~4x reduction (768-dim: 3072 bytes -> 784 bytes)
- Recall: Typically >90% recall@10 compared to dense
- Latency: ~10-20% overhead from dequantization during search
Sourcepub fn try_insert_quantized(
&self,
vector: &[f32],
) -> Result<usize, EmbeddingStorageError>
pub fn try_insert_quantized( &self, vector: &[f32], ) -> Result<usize, EmbeddingStorageError>
Try to insert a quantized vector into the index.
§Errors
Returns Err(CapacityExceeded) if max_nodes limit is reached.
Sourcepub fn insert_quantized_vector(&self, quantized: ScalarQuantizedVector) -> usize
pub fn insert_quantized_vector(&self, quantized: ScalarQuantizedVector) -> usize
Insert a pre-quantized vector into the index.
Sourcepub fn insert_tt(
&self,
vector: Vec<f32>,
config: &TTConfig,
) -> Result<usize, String>
pub fn insert_tt( &self, vector: Vec<f32>, config: &TTConfig, ) -> Result<usize, String>
Insert a vector with TensorTrain compression.
Uses Tensor Train decomposition to compress the vector before storage, achieving 8-10x memory savings for high-dimensional vectors (768+ dims). The config parameter controls compression accuracy vs size tradeoff.
§Errors
Returns an error if TT decomposition fails.
Sourcepub fn insert_tt_vector(&self, tt: &TTVector) -> usize
pub fn insert_tt_vector(&self, tt: &TTVector) -> usize
Insert a pre-decomposed TensorTrain vector.
Reconstructs to dense for storage - HNSW needs fast distance computations. TT compression is useful for storage/transmission, not HNSW indexing.
Sourcepub fn insert_batch_tt(
&self,
vectors: Vec<Vec<f32>>,
config: &TTConfig,
) -> Result<Vec<usize>, String>
pub fn insert_batch_tt( &self, vectors: Vec<Vec<f32>>, config: &TTConfig, ) -> Result<Vec<usize>, String>
Insert multiple vectors with TensorTrain validation in batch.
Vectors are validated via TT decomposition but stored as dense for fast HNSW distance computations.
§Errors
Returns an error if batch TT decomposition fails.
Sourcepub fn search_tt(
&self,
query: &[f32],
k: usize,
config: &TTConfig,
) -> Vec<(usize, f32)>
pub fn search_tt( &self, query: &[f32], k: usize, config: &TTConfig, ) -> Vec<(usize, f32)>
Search with a TensorTrain-compressed query.
The query is compressed before searching, reducing memory bandwidth during the search. Works best when the index contains TT-compressed vectors.
Sourcepub fn search_tt_with_ef(
&self,
query_tt: &TTVector,
k: usize,
ef: usize,
) -> Vec<(usize, f32)>
pub fn search_tt_with_ef( &self, query_tt: &TTVector, k: usize, ef: usize, ) -> Vec<(usize, f32)>
Search with TT query and custom ef parameter.
Uses native TT operations throughout - no dense reconstruction needed. For TT-to-TT comparisons, this is zero-allocation.
§Panics
Panics if the internal lock is poisoned.
Sourcepub fn insert_embedding(&self, embedding: EmbeddingStorage) -> usize
pub fn insert_embedding(&self, embedding: EmbeddingStorage) -> usize
Insert an embedding (dense or sparse) into the index.
Use try_insert_embedding for a non-panicking version.
§Panics
Panics if the index is at capacity (max_nodes), if Delta vectors are used,
or if the internal lock is poisoned.
Sourcepub fn try_insert_embedding(
&self,
embedding: EmbeddingStorage,
) -> Result<usize, EmbeddingStorageError>
pub fn try_insert_embedding( &self, embedding: EmbeddingStorage, ) -> Result<usize, EmbeddingStorageError>
Sourcepub fn search(&self, query: &[f32], k: usize) -> Vec<(usize, f32)>
pub fn search(&self, query: &[f32], k: usize) -> Vec<(usize, f32)>
Search for k nearest neighbors of the query vector.
Sourcepub fn search_sparse(&self, query: &SparseVector, k: usize) -> Vec<(usize, f32)>
pub fn search_sparse(&self, query: &SparseVector, k: usize) -> Vec<(usize, f32)>
Search for k nearest neighbors using a sparse query.
Sourcepub fn search_with_ef(
&self,
query: &[f32],
k: usize,
ef: usize,
) -> Vec<(usize, f32)>
pub fn search_with_ef( &self, query: &[f32], k: usize, ef: usize, ) -> Vec<(usize, f32)>
Search with custom ef parameter (higher = better recall, slower)
§Panics
Panics if the internal lock is poisoned.
Sourcepub fn search_sparse_with_ef(
&self,
query: &SparseVector,
k: usize,
ef: usize,
) -> Vec<(usize, f32)>
pub fn search_sparse_with_ef( &self, query: &SparseVector, k: usize, ef: usize, ) -> Vec<(usize, f32)>
Sourcepub fn get_vector(&self, id: usize) -> Option<Vec<f32>>
pub fn get_vector(&self, id: usize) -> Option<Vec<f32>>
Get the vector for a node ID (as dense, for compatibility).
Returns None if the vector cannot be converted to dense (e.g., Delta without registry).
§Panics
Panics if the internal lock is poisoned.
Sourcepub fn get_embedding(&self, id: usize) -> Option<EmbeddingStorage>
pub fn get_embedding(&self, id: usize) -> Option<EmbeddingStorage>
Sourcepub fn memory_stats(&self) -> HNSWMemoryStats
pub fn memory_stats(&self) -> HNSWMemoryStats
Sourcepub const fn config(&self) -> &HNSWConfig
pub const fn config(&self) -> &HNSWConfig
Get configuration
Sourcepub const fn set_ef_search(&mut self, ef: usize)
pub const fn set_ef_search(&mut self, ef: usize)
Set ef_search parameter (controls recall/speed tradeoff)
Trait Implementations§
Auto Trait Implementations§
impl !Freeze for HNSWIndex
impl !RefUnwindSafe for HNSWIndex
impl Send for HNSWIndex
impl Sync for HNSWIndex
impl Unpin for HNSWIndex
impl UnsafeUnpin for HNSWIndex
impl UnwindSafe for HNSWIndex
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> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.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 moreSource§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.