qdrant_client/builders/mmr_builder.rs
1use crate::qdrant::Mmr;
2
3#[must_use]
4#[derive(Clone)]
5pub struct MmrBuilder {
6 /// Tunable parameter for the MMR algorithm.
7 /// Determines the balance between diversity and relevance.
8 ///
9 /// A higher value favors diversity (dissimilarity to selected results),
10 /// while a lower value favors relevance (similarity to the query vector).
11 ///
12 /// Must be in the range [0, 1].
13 /// Default value is 0.5.
14 pub(crate) diversity: Option<Option<f32>>,
15 /// The maximum number of candidates to consider for re-ranking.
16 ///
17 /// If not specified, the `limit` value is used.
18 pub(crate) candidates_limit: Option<Option<u32>>,
19}
20
21impl MmrBuilder {
22 /// Create a new MmrBuilder with default values.
23 pub fn new() -> Self {
24 Self::create_empty()
25 }
26
27 /// Create a new MmrBuilder with both diversity and candidates limit.
28 ///
29 /// # Arguments
30 ///
31 /// * `diversity` - Must be in the range [0, 1]. Higher values favor diversity.
32 /// * `candidates_limit` - Maximum number of candidates to consider for re-ranking.
33 ///
34 /// # Examples
35 ///
36 /// ```
37 /// use qdrant_client::qdrant::MmrBuilder;
38 ///
39 /// let mmr = MmrBuilder::with_params(0.6, 100).build();
40 /// ```
41 pub fn with_params(diversity: f32, candidates_limit: u32) -> Self {
42 Self::new()
43 .diversity(diversity)
44 .candidates_limit(candidates_limit)
45 }
46
47 /// Tunable parameter for the MMR algorithm.
48 /// Determines the balance between diversity and relevance.
49 ///
50 /// A higher value favors diversity (dissimilarity to selected results),
51 /// while a lower value favors relevance (similarity to the query vector).
52 ///
53 /// Must be in the range [0, 1].
54 /// Default value is 0.5.
55 pub fn diversity(self, value: f32) -> Self {
56 let mut new = self;
57 new.diversity = Option::Some(Option::Some(value));
58 new
59 }
60
61 /// The maximum number of candidates to consider for re-ranking.
62 ///
63 /// If not specified, the `limit` value is used.
64 pub fn candidates_limit(self, value: u32) -> Self {
65 let mut new = self;
66 new.candidates_limit = Option::Some(Option::Some(value));
67 new
68 }
69
70 pub fn build(self) -> Mmr {
71 Mmr {
72 diversity: self.diversity.unwrap_or_default(),
73 candidates_limit: self.candidates_limit.unwrap_or_default(),
74 }
75 }
76
77 /// Create an empty builder, with all fields set to `None` or `PhantomData`.
78 fn create_empty() -> Self {
79 Self {
80 diversity: core::default::Default::default(),
81 candidates_limit: core::default::Default::default(),
82 }
83 }
84}
85
86impl From<MmrBuilder> for Mmr {
87 fn from(value: MmrBuilder) -> Self {
88 value.build()
89 }
90}
91
92impl Default for MmrBuilder {
93 fn default() -> Self {
94 Self::create_empty()
95 }
96}