avocado_core/storage/
vector.rs

1//! Vector search abstraction
2//!
3//! Provides a unified interface for vector similarity search
4//! across different backends (HNSW for SQLite, pgvector for PostgreSQL).
5
6use async_trait::async_trait;
7use crate::types::{Result, ScoredSpan, Span};
8
9/// Result from vector similarity search
10#[derive(Debug, Clone)]
11pub struct VectorSearchResult {
12    /// The matching span
13    pub span: Span,
14    /// Similarity score (higher is more similar)
15    pub score: f32,
16}
17
18impl From<VectorSearchResult> for ScoredSpan {
19    fn from(r: VectorSearchResult) -> Self {
20        ScoredSpan {
21            span: r.span,
22            score: r.score,
23        }
24    }
25}
26
27impl From<ScoredSpan> for VectorSearchResult {
28    fn from(s: ScoredSpan) -> Self {
29        VectorSearchResult {
30            span: s.span,
31            score: s.score,
32        }
33    }
34}
35
36/// Vector search provider trait
37///
38/// Implementations provide vector similarity search capabilities.
39/// This abstracts over HNSW (for SQLite) and pgvector (for PostgreSQL).
40#[async_trait]
41pub trait VectorSearchProvider: Send + Sync {
42    /// Search for similar spans
43    ///
44    /// # Arguments
45    /// * `query_embedding` - Query vector
46    /// * `k` - Number of results to return
47    ///
48    /// # Returns
49    /// Vector of scored spans, sorted by relevance (highest score first)
50    async fn search(&self, query_embedding: &[f32], k: usize) -> Result<Vec<VectorSearchResult>>;
51
52    /// Get number of indexed spans
53    fn len(&self) -> usize;
54
55    /// Check if index is empty
56    fn is_empty(&self) -> bool {
57        self.len() == 0
58    }
59
60    /// Get embedding dimension
61    fn dimension(&self) -> usize;
62}