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}