pub struct HybridIndex {
pub semantic: SearchIndex,
/* private fields */
}Expand description
Combined semantic + keyword search index with RRF fusion.
Build once from chunks and pre-computed embeddings; query repeatedly
via search.
Fields§
§semantic: SearchIndexSemantic (dense vector) search index.
Implementations§
Source§impl HybridIndex
impl HybridIndex
Sourcepub fn new(
chunks: Vec<CodeChunk>,
embeddings: &[Vec<f32>],
cascade_dim: Option<usize>,
) -> Result<Self>
pub fn new( chunks: Vec<CodeChunk>, embeddings: &[Vec<f32>], cascade_dim: Option<usize>, ) -> Result<Self>
Build a HybridIndex from raw chunks and their pre-computed embeddings.
Constructs both the SearchIndex and Bm25Index in one call.
cascade_dim is forwarded to SearchIndex::new for optional MRL
cascade pre-filtering.
§Errors
Returns an error if the BM25 index cannot be built (e.g., tantivy schema or writer failure).
Sourcepub fn from_parts(semantic: SearchIndex, bm25: Bm25Index) -> Self
pub fn from_parts(semantic: SearchIndex, bm25: Bm25Index) -> Self
Assemble a HybridIndex from pre-built components.
Useful when the caller has already constructed the sub-indices separately (e.g., loaded from a cache).
Sourcepub fn search(
&self,
query_embedding: &[f32],
query_text: &str,
top_k: usize,
threshold: f32,
mode: SearchMode,
) -> Vec<(usize, f32)>
pub fn search( &self, query_embedding: &[f32], query_text: &str, top_k: usize, threshold: f32, mode: SearchMode, ) -> Vec<(usize, f32)>
Search the index and return (chunk_index, score) pairs.
Dispatches based on mode:
SearchMode::Semantic— pure dense vector search viaSearchIndex::rank.SearchMode::Keyword— pure BM25 keyword search, truncated totop_k.SearchMode::Hybrid— retrieves both ranked lists, fuses them withrrf_fuse, then truncates totop_k.
Scores are min-max normalized to [0, 1] regardless of mode, so
a threshold of 0.5 always means “above midpoint of the score range”
whether the underlying scores are cosine similarity, BM25, or RRF.
Auto Trait Implementations§
impl Freeze for HybridIndex
impl !RefUnwindSafe for HybridIndex
impl Send for HybridIndex
impl Sync for HybridIndex
impl Unpin for HybridIndex
impl UnsafeUnpin for HybridIndex
impl !UnwindSafe for HybridIndex
Blanket Implementations§
Source§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
Source§type ArchivedMetadata = ()
type ArchivedMetadata = ()
Source§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
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> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for 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 moreSource§impl<T> LayoutRaw for T
impl<T> LayoutRaw for T
Source§fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
Source§impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
Source§unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
Source§fn resolve_niched(out: Place<NichedOption<T, N1>>)
fn resolve_niched(out: Place<NichedOption<T, N1>>)
out indicating that a T is niched.