vectorizer_sdk/models/
hybrid_search.rs1use std::collections::HashMap;
4use serde::{Deserialize, Serialize};
5
6#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct SparseVector {
9 pub indices: Vec<usize>,
11 pub values: Vec<f32>,
13}
14
15impl SparseVector {
16 pub fn new(indices: Vec<usize>, values: Vec<f32>) -> Result<Self, String> {
18 if indices.len() != values.len() {
19 return Err("Indices and values must have the same length".to_string());
20 }
21 if indices.is_empty() {
22 return Err("Sparse vector cannot be empty".to_string());
23 }
24 for &idx in &indices {
25 if idx == usize::MAX {
26 return Err("Indices must be valid".to_string());
27 }
28 }
29 for &val in &values {
30 if val.is_nan() || val.is_infinite() {
31 return Err("Values must be finite numbers".to_string());
32 }
33 }
34 Ok(Self { indices, values })
35 }
36}
37
38#[derive(Debug, Clone, Serialize, Deserialize)]
40pub struct HybridSearchRequest {
41 pub collection: String,
43 pub query: String,
45 pub query_sparse: Option<SparseVector>,
47 #[serde(default = "default_alpha")]
49 pub alpha: f32,
50 #[serde(default = "default_algorithm")]
52 pub algorithm: HybridScoringAlgorithm,
53 #[serde(default = "default_dense_k")]
55 pub dense_k: usize,
56 #[serde(default = "default_sparse_k")]
58 pub sparse_k: usize,
59 #[serde(default = "default_final_k")]
61 pub final_k: usize,
62}
63
64fn default_alpha() -> f32 {
65 0.7
66}
67
68fn default_algorithm() -> HybridScoringAlgorithm {
69 HybridScoringAlgorithm::ReciprocalRankFusion
70}
71
72fn default_dense_k() -> usize {
73 20
74}
75
76fn default_sparse_k() -> usize {
77 20
78}
79
80fn default_final_k() -> usize {
81 10
82}
83
84#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
86#[serde(rename_all = "lowercase")]
87pub enum HybridScoringAlgorithm {
88 #[serde(rename = "rrf")]
90 ReciprocalRankFusion,
91 #[serde(rename = "weighted")]
93 WeightedCombination,
94 #[serde(rename = "alpha")]
96 AlphaBlending,
97}
98
99#[derive(Debug, Clone, Serialize, Deserialize)]
101pub struct HybridSearchResult {
102 pub id: String,
104 pub score: f32,
106 pub vector: Option<Vec<f32>>,
108 pub payload: Option<HashMap<String, serde_json::Value>>,
110}
111
112#[derive(Debug, Clone, Serialize, Deserialize)]
114pub struct HybridSearchResponse {
115 pub results: Vec<HybridSearchResult>,
117 pub query: String,
119 pub query_sparse: Option<SparseVectorResponse>,
121 pub alpha: f32,
123 pub algorithm: String,
125 pub duration_ms: Option<u64>,
127}
128
129#[derive(Debug, Clone, Serialize, Deserialize)]
131pub struct SparseVectorResponse {
132 pub indices: Vec<usize>,
134 pub values: Vec<f32>,
136}
137