pub struct EmbeddingIndex {
pub version: u32,
pub dimensions: usize,
pub model_id: Option<String>,
pub entries: Vec<EmbeddingEntry>,
pub file_hashes: HashMap<String, String>,
}Fields§
§version: u32§dimensions: usize§model_id: Option<String>Model identifier that generated these embeddings. Used for mismatch detection when the user switches models.
entries: Vec<EmbeddingEntry>§file_hashes: HashMap<String, String>Implementations§
Source§impl EmbeddingIndex
impl EmbeddingIndex
pub fn new(dimensions: usize) -> Self
Sourcepub fn new_with_model(dimensions: usize, model_id: &str) -> Self
pub fn new_with_model(dimensions: usize, model_id: &str) -> Self
Create a new index tagged with a specific model identity.
Sourcepub fn model_mismatch<'a>(
&'a self,
current_model: &'a str,
) -> Option<(&'a str, &'a str)>
pub fn model_mismatch<'a>( &'a self, current_model: &'a str, ) -> Option<(&'a str, &'a str)>
Check if the index was built with a different model than currently selected.
Returns Some((stored_model, current_model)) on mismatch, None if compatible.
Sourcepub fn dimension_mismatch(&self, engine_dimensions: usize) -> bool
pub fn dimension_mismatch(&self, engine_dimensions: usize) -> bool
Check if index dimensions are incompatible with the current engine.
Sourcepub fn memory_usage_bytes(&self) -> usize
pub fn memory_usage_bytes(&self) -> usize
Approximate heap memory used by this index in bytes.
Sourcepub fn unload(&mut self)
pub fn unload(&mut self)
Drops all in-memory data to free heap. Index can be re-loaded from disk.
Sourcepub fn load_or_new(root: &Path, dimensions: usize) -> Self
pub fn load_or_new(root: &Path, dimensions: usize) -> Self
Load a previously saved index, or create a new empty one.
Sourcepub fn files_needing_update(&self, chunks: &[CodeChunk]) -> Vec<String>
pub fn files_needing_update(&self, chunks: &[CodeChunk]) -> Vec<String>
Determine which files need re-embedding based on content hashes.
When the index is empty (no prior embeddings), skips hash computation entirely by returning all unique file paths from chunks directly.
Sourcepub fn pending_chunk_count(&self, chunks: &[CodeChunk]) -> usize
pub fn pending_chunk_count(&self, chunks: &[CodeChunk]) -> usize
Number of chunks a re-embed pass would have to embed right now — i.e.
the chunks belonging to files flagged by Self::files_needing_update.
Used by the hybrid/dense cold-start guard (#512): on a server that came up before the on-disk index existed, the first query would otherwise embed the entire corpus inline under the request watchdog, producing a runaway the watchdog abandons but cannot cancel. Counting the pending chunks up front lets the caller fall back instead of starting that embed.
Sourcepub fn update(
&mut self,
chunks: &[CodeChunk],
new_embeddings: &[(usize, Vec<f32>)],
changed_files: &[String],
precomputed_hashes: Option<HashMap<String, String>>,
)
pub fn update( &mut self, chunks: &[CodeChunk], new_embeddings: &[(usize, Vec<f32>)], changed_files: &[String], precomputed_hashes: Option<HashMap<String, String>>, )
Update the index with new embeddings for changed files. Preserves existing embeddings for unchanged files.
precomputed_hashes can be passed to avoid re-computing file hashes
when the caller already has them (e.g. from files_needing_update).
When None, hashes are computed from chunks.
Sourcepub fn get_aligned_flat(&self, chunks: &[CodeChunk]) -> Option<FlatEmbeddings>
pub fn get_aligned_flat(&self, chunks: &[CodeChunk]) -> Option<FlatEmbeddings>
Get all embeddings in chunk order (aligned with BM25Index.chunks) as a
single contiguous FlatEmbeddings allocation. Returns None if the index
doesn’t cover all chunks.
The flat layout (_n_vectors × dim in row-major order) gives sequential
memory access during dot-product scoring — one dereference instead of the
two-level indirection of Arc<[Vec<f32>]>.
pub fn coverage(&self, total_chunks: usize) -> f64
pub fn save(&self, root: &Path) -> Result<()>
pub fn load(root: &Path) -> Option<Self>
Trait Implementations§
Source§impl Clone for EmbeddingIndex
impl Clone for EmbeddingIndex
Source§fn clone(&self) -> EmbeddingIndex
fn clone(&self) -> EmbeddingIndex
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for EmbeddingIndex
impl Debug for EmbeddingIndex
Source§impl<'de> Deserialize<'de> for EmbeddingIndex
impl<'de> Deserialize<'de> for EmbeddingIndex
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Auto Trait Implementations§
impl Freeze for EmbeddingIndex
impl RefUnwindSafe for EmbeddingIndex
impl Send for EmbeddingIndex
impl Sync for EmbeddingIndex
impl Unpin for EmbeddingIndex
impl UnsafeUnpin for EmbeddingIndex
impl UnwindSafe for EmbeddingIndex
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
impl<A, B, T> HttpServerConnExec<A, B> for Twhere
B: Body,
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