Skip to main content

qdrant_client/builders/
mmr_builder.rs

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