qdrant_edge/shard/query/
mod.rs1#[cfg(feature = "api")]
2mod conversions;
3pub mod formula;
4pub mod mmr;
5pub mod planned_query;
6pub mod query_enum;
7pub mod scroll;
8mod validation;
9
10pub mod query_context;
11#[cfg(test)]
12mod tests;
13
14use crate::common::types::ScoreType;
15use ordered_float::OrderedFloat;
16use crate::segment::data_types::order_by::OrderBy;
17use crate::segment::data_types::vectors::VectorInternal;
18use crate::segment::index::query_optimization::rescore_formula::parsed_formula::ParsedFormula;
19use crate::segment::types::*;
20use serde::Serialize;
21
22use self::query_enum::*;
23use crate::shard::search::CoreSearchRequest;
24
25pub type ShardQueryResponse = Vec<Vec<ScoredPoint>>;
29
30#[derive(Clone, Debug, Hash, Serialize)]
36pub struct ShardQueryRequest {
37 pub prefetches: Vec<ShardPrefetch>,
38 #[serde(skip_serializing_if = "Option::is_none")]
39 pub query: Option<ScoringQuery>,
40 #[serde(skip_serializing_if = "Option::is_none")]
41 pub filter: Option<Filter>,
42 #[serde(skip_serializing_if = "Option::is_none")]
43 pub score_threshold: Option<OrderedFloat<ScoreType>>,
44 pub limit: usize,
45 pub offset: usize,
46 #[serde(skip_serializing_if = "Option::is_none")]
48 pub params: Option<SearchParams>,
49 pub with_vector: WithVector,
50 pub with_payload: WithPayloadInterface,
51}
52
53impl ShardQueryRequest {
54 pub fn prefetches_depth(&self) -> usize {
55 self.prefetches
56 .iter()
57 .map(ShardPrefetch::depth)
58 .max()
59 .unwrap_or(0)
60 }
61
62 pub fn filter_refs(&self) -> Vec<Option<&Filter>> {
63 let mut filters = vec![];
64 filters.push(self.filter.as_ref());
65
66 for prefetch in &self.prefetches {
67 filters.extend(prefetch.filter_refs())
68 }
69
70 filters
71 }
72}
73
74#[derive(Clone, Debug, Hash, Serialize)]
75pub struct ShardPrefetch {
76 pub prefetches: Vec<ShardPrefetch>,
77 #[serde(skip_serializing_if = "Option::is_none")]
78 pub query: Option<ScoringQuery>,
79 pub limit: usize,
80 #[serde(skip_serializing_if = "Option::is_none")]
81 pub params: Option<SearchParams>,
82 #[serde(skip_serializing_if = "Option::is_none")]
83 pub filter: Option<Filter>,
84 #[serde(skip_serializing_if = "Option::is_none")]
85 pub score_threshold: Option<OrderedFloat<ScoreType>>,
86}
87
88impl ShardPrefetch {
89 pub fn depth(&self) -> usize {
90 let mut depth = 1;
91 for prefetch in &self.prefetches {
92 depth = depth.max(prefetch.depth() + 1);
93 }
94 depth
95 }
96
97 fn filter_refs(&self) -> Vec<Option<&Filter>> {
98 let mut filters = vec![];
99
100 filters.push(self.filter.as_ref());
101
102 for prefetch in &self.prefetches {
103 filters.extend(prefetch.filter_refs())
104 }
105
106 filters
107 }
108}
109
110#[derive(Clone, Debug, PartialEq, Hash, Serialize)]
112pub enum ScoringQuery {
113 Vector(QueryEnum),
115
116 Fusion(FusionInternal),
118
119 OrderBy(OrderBy),
121
122 Formula(ParsedFormula),
124
125 Sample(SampleInternal),
127
128 Mmr(MmrInternal),
137}
138
139impl ScoringQuery {
140 pub fn get_vector_name(&self) -> Option<&VectorName> {
142 match self {
143 ScoringQuery::Vector(query) => Some(query.get_vector_name()),
144 ScoringQuery::Mmr(mmr) => Some(&mmr.using),
145 ScoringQuery::Fusion(_)
146 | ScoringQuery::OrderBy(_)
147 | ScoringQuery::Formula(_)
148 | ScoringQuery::Sample(_) => None,
149 }
150 }
151}
152
153#[derive(Clone, Debug, PartialEq, Hash, Serialize)]
154pub enum FusionInternal {
155 Rrf {
157 k: usize,
158 weights: Option<Vec<ordered_float::OrderedFloat<f32>>>,
161 },
162 Dbsf,
164}
165
166#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash, Serialize)]
167pub enum SampleInternal {
168 Random,
169}
170
171#[derive(Clone, Debug, PartialEq, Hash, Serialize)]
173pub struct MmrInternal {
174 pub vector: VectorInternal,
176 pub using: VectorNameBuf,
178 pub lambda: OrderedFloat<f32>,
180 pub candidates_limit: usize,
182}
183
184impl From<CoreSearchRequest> for ShardQueryRequest {
185 fn from(value: CoreSearchRequest) -> Self {
186 let CoreSearchRequest {
187 query,
188 filter,
189 score_threshold,
190 limit,
191 offset,
192 params,
193 with_vector,
194 with_payload,
195 } = value;
196
197 Self {
198 prefetches: vec![],
199 query: Some(ScoringQuery::Vector(query)),
200 filter,
201 score_threshold: score_threshold.map(OrderedFloat),
202 limit,
203 offset,
204 params,
205 with_vector: with_vector.unwrap_or_default(),
206 with_payload: with_payload.unwrap_or_default(),
207 }
208 }
209}