Skip to main content

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}