rucora_core/retrieval/
trait.rs1use async_trait::async_trait;
6use serde::{Deserialize, Serialize};
7
8use crate::error::ProviderError;
9
10#[derive(Debug, Clone, Serialize, Deserialize)]
12pub struct VectorRecord {
13 pub id: String,
15 pub vector: Vec<f32>,
17 #[serde(skip_serializing_if = "Option::is_none")]
19 pub text: Option<String>,
20 #[serde(skip_serializing_if = "Option::is_none")]
22 pub metadata: Option<serde_json::Value>,
23}
24
25impl VectorRecord {
26 pub fn new(id: impl Into<String>, vector: Vec<f32>) -> Self {
28 assert!(!vector.is_empty(), "VectorRecord vector must not be empty");
29 Self {
30 id: id.into(),
31 vector,
32 text: None,
33 metadata: None,
34 }
35 }
36
37 pub fn with_text(mut self, text: impl Into<String>) -> Self {
39 self.text = Some(text.into());
40 self
41 }
42
43 pub fn with_metadata(mut self, metadata: serde_json::Value) -> Self {
45 self.metadata = Some(metadata);
46 self
47 }
48}
49
50#[derive(Debug, Clone, Serialize, Deserialize)]
52pub struct SearchResult {
53 pub id: String,
55 pub score: f32,
57 #[serde(skip_serializing_if = "Option::is_none")]
59 pub vector: Option<Vec<f32>>,
60 #[serde(skip_serializing_if = "Option::is_none")]
62 pub text: Option<String>,
63 #[serde(skip_serializing_if = "Option::is_none")]
65 pub metadata: Option<serde_json::Value>,
66}
67
68#[derive(Debug, Clone, Default)]
70pub struct VectorQuery {
71 pub vector: Vec<f32>,
73 pub top_k: usize,
75 pub score_threshold: Option<f32>,
77 pub filter: Option<serde_json::Value>,
79}
80
81impl VectorQuery {
82 pub fn new(vector: Vec<f32>) -> Self {
84 Self {
85 vector,
86 top_k: 10,
87 score_threshold: None,
88 filter: None,
89 }
90 }
91
92 pub fn with_top_k(mut self, top_k: usize) -> Self {
94 assert!(top_k > 0, "top_k must be greater than 0");
95 assert!(top_k <= 1000, "top_k must not exceed 1000");
96 self.top_k = top_k;
97 self
98 }
99
100 pub fn with_score_threshold(mut self, threshold: f32) -> Self {
102 self.score_threshold = Some(threshold);
103 self
104 }
105
106 pub fn with_filter(mut self, filter: serde_json::Value) -> Self {
108 self.filter = Some(filter);
109 self
110 }
111}
112
113#[async_trait]
117pub trait VectorStore: Send + Sync {
118 async fn upsert(&self, records: Vec<VectorRecord>) -> Result<(), ProviderError>;
120
121 async fn delete(&self, ids: Vec<String>) -> Result<(), ProviderError>;
123
124 async fn get(&self, ids: Vec<String>) -> Result<Vec<VectorRecord>, ProviderError>;
126
127 async fn search(&self, query: VectorQuery) -> Result<Vec<SearchResult>, ProviderError>;
129
130 async fn clear(&self) -> Result<(), ProviderError>;
132
133 async fn count(&self) -> Result<usize, ProviderError>;
135}