1pub mod chromadb;
7pub mod chunked_vector_store;
8pub mod document_store;
9mod file_store;
10mod memory;
11mod provider;
12
13#[cfg(feature = "mongodb-persistence")]
14mod mongo_document_store;
15
16#[cfg(feature = "qdrant-integration")]
17mod qdrant;
18
19#[cfg(feature = "redis-storage")]
20pub mod redis_store;
21
22#[cfg(feature = "sqlite-storage")]
23pub mod sqlite_store;
24
25#[cfg(feature = "pgvector-storage")]
26pub mod pgvector;
27
28pub mod pinecone;
29
30pub use chunked_vector_store::ChunkedVectorStore;
31pub use document_store::{
32 ChunkedDocumentStore, ChunkedDocumentStoreTrait, DocumentStore, InMemoryChunkedDocumentStore,
33 InMemoryDocumentStore,
34};
35pub use file_store::FileVectorStore;
36pub use memory::InMemoryVectorStore;
37pub use pinecone::PineconeStore;
38pub use provider::{VectorStoreBuilder, VectorStoreProvider, VectorStoreType};
39
40#[cfg(feature = "mongodb-persistence")]
41pub use mongo_document_store::{MongoChunkedDocumentStore, MongoStoreConfig};
42
43#[cfg(feature = "qdrant-integration")]
44pub use qdrant::{QdrantConfig, QdrantDistance, QdrantVectorStore};
45
46pub use chromadb::{ChromaDBConfig, ChromaDBVectorStore};
47
48#[cfg(feature = "redis-storage")]
49pub use redis_store::{RedisDocumentStore, RedisStoreConfig};
50
51#[cfg(feature = "sqlite-storage")]
52pub use sqlite_store::{SQLiteDocumentStore, SQLiteStoreConfig};
53
54use async_trait::async_trait;
55use std::error::Error;
56
57pub use lc_shared::document::{ChunkDocument, Document, SearchResult, VectorDocument};
59
60pub use lc_core::math::cosine_similarity;
62
63#[derive(Debug)]
65pub enum VectorStoreError {
66 DocumentNotFound(String),
68
69 EmbeddingError(String),
71
72 StorageError(String),
74
75 ConnectionError(String),
77}
78
79impl std::fmt::Display for VectorStoreError {
80 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
81 match self {
82 VectorStoreError::DocumentNotFound(id) => write!(f, "Document not found: {}", id),
83 VectorStoreError::EmbeddingError(msg) => write!(f, "Embedding error: {}", msg),
84 VectorStoreError::StorageError(msg) => write!(f, "Storage error: {}", msg),
85 VectorStoreError::ConnectionError(msg) => write!(f, "Connection error: {}", msg),
86 }
87 }
88}
89
90impl Error for VectorStoreError {}
91
92#[async_trait]
94pub trait VectorStore: Send + Sync {
95 async fn add_documents(
104 &self,
105 documents: Vec<Document>,
106 embeddings: Vec<Vec<f32>>,
107 ) -> Result<Vec<String>, VectorStoreError>;
108
109 async fn similarity_search(
118 &self,
119 query_embedding: &[f32],
120 k: usize,
121 ) -> Result<Vec<SearchResult>, VectorStoreError>;
122
123 async fn get_document(&self, id: &str) -> Result<Option<Document>, VectorStoreError>;
125
126 async fn get_embedding(&self, id: &str) -> Result<Option<Vec<f32>>, VectorStoreError>;
128
129 async fn delete_document(&self, id: &str) -> Result<(), VectorStoreError>;
131
132 async fn count(&self) -> usize;
134
135 async fn clear(&self) -> Result<(), VectorStoreError>;
137}
138
139pub use lc_embeddings::{EmbeddingError, Embeddings};
144
145#[cfg(test)]
146mod tests {
147 use super::*;
148
149 #[test]
150 fn test_document_creation() {
151 let doc = Document::new("Hello, world!")
152 .with_metadata("source", "test")
153 .with_id("doc-1");
154
155 assert_eq!(doc.content, "Hello, world!");
156 assert_eq!(doc.metadata.get("source"), Some(&"test".to_string()));
157 assert_eq!(doc.id, Some("doc-1".to_string()));
158 }
159
160 #[test]
161 fn test_document_page_content() {
162 let doc = Document::new("Test content");
163 assert_eq!(doc.page_content(), "Test content");
164 }
165}