Skip to main content

IndexSession

Struct IndexSession 

Source
pub struct IndexSession { /* private fields */ }
Expand description

An index on disk together with the backends that query and refresh it.

This is the whole lifecycle in one place - open, check the index still matches the pipeline that built it, update it incrementally, persist it, search it - so callers do not each reimplement it and drift apart. The semtree CLI and the MCP server are both thin shells over this type.

use std::sync::Arc;
use semtree_rag::{IndexSession, SearchFilters, SearchMode};
use semtree_embed::fastembed::FastEmbedder;
use semtree_store::usearch::UsearchStore;
use semtree_embed::Embedder;

let embedder = Arc::new(FastEmbedder::new()?);
let store = Arc::new(UsearchStore::new(embedder.dimension())?);

let mut session = IndexSession::open(embedder, store, std::path::Path::new(".semtree"))?;
session.index(std::path::Path::new("."), false, |_, _| {}).await?;
session.save()?;

let hits = session
    .search("where do we skip unchanged files", 5, SearchMode::Hybrid, &SearchFilters::default())
    .await?;

Implementations§

Source§

impl IndexSession

Source

pub fn open( embedder: Arc<dyn Embedder>, store: Arc<dyn VectorStore>, index_dir: &Path, ) -> Result<Self, RagError>

Open the index at index_dir, or start an empty session if there is none yet.

An index built by a different embedder, store, or chunker is not loaded: it is left on disk and flagged for rebuild, so the next index call replaces it instead of mixing vectors that cannot be compared. Query it before that and it looks empty, which is the honest answer.

Source

pub fn open_existing( embedder: Arc<dyn Embedder>, store: Arc<dyn VectorStore>, index_dir: &Path, ) -> Result<Self, RagError>

Like open, but refuses to start without a usable index. Use it on read-only paths, where an empty result would otherwise be indistinguishable from a codebase that was never indexed.

Source

pub fn pending_rebuild(&self) -> Option<&RebuildReason>

Why the next index call will rebuild from scratch, if it will. None means the index on disk is usable as-is.

Source

pub async fn index( &mut self, source_root: &Path, full: bool, on_progress: impl Fn(usize, usize), ) -> Result<IndexReport, RagError>

Index source_root, skipping files whose content has not changed.

Set full to force a rebuild; otherwise a rebuild still happens when pending_rebuild says the existing index cannot be trusted. Progress is reported as (files_done, files_total).

Nothing is written to disk until save.

Source

pub fn save(&self) -> Result<(), RagError>

Persist the vectors, the chunk metadata and the manifest together. They are only consistent as a set, so they are always written as one.

Source

pub async fn search( &self, query: &str, top_k: usize, mode: SearchMode, filters: &SearchFilters, ) -> Result<Vec<SearchResult<'_>>, RagError>

Search the index, returning at most top_k results that pass filters.

Filters are metadata narrowing applied after ranking, so the ranker is asked for extra candidates to compensate. Hits the registry cannot resolve are dropped: without a chunk there is no path, name or code to hand back.

Source

pub async fn context( &self, query: &str, top_k: usize, mode: SearchMode, ) -> Result<ContextWindow, RagError>

Build a prompt-ready context window for query from the top top_k chunks under mode.

Source

pub fn stats(&self) -> IndexStats

What the index currently holds, including the live vector count.

Source

pub fn index_dir(&self) -> &Path

Where this session reads and writes its index.

Source

pub fn registry(&self) -> &ChunkRegistry

The chunk metadata backing the index.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more