Skip to main content

iqdb_types/
search.rs

1//! Parameters for a similarity search.
2
3use crate::filter::Filter;
4use crate::metric::DistanceMetric;
5
6/// The parameters of a nearest-neighbor search.
7///
8/// `k` is how many results to return, `metric` is how distance is measured,
9/// `ef` is an optional search-breadth knob (the candidate-list size some
10/// approximate indexes expose; ignored by exact search), and `filter` is an
11/// optional metadata predicate restricting which records are eligible. Start
12/// from [`SearchParams::new`] and set the optional fields as needed.
13///
14/// # Examples
15///
16/// ```
17/// use iqdb_types::{DistanceMetric, Filter, SearchParams, Value};
18///
19/// let params = SearchParams {
20///     filter: Some(Filter::eq("published", Value::Bool(true))),
21///     ..SearchParams::new(10, DistanceMetric::Cosine)
22/// };
23///
24/// assert_eq!(params.k, 10);
25/// assert_eq!(params.metric, DistanceMetric::Cosine);
26/// assert_eq!(params.ef, None);
27/// assert!(params.filter.is_some());
28/// ```
29#[derive(Debug, Clone, PartialEq)]
30#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
31pub struct SearchParams {
32    /// The number of nearest neighbors to return.
33    pub k: usize,
34    /// Optional search breadth (candidate-list size) for approximate indexes;
35    /// `None` lets the engine choose, and exact search ignores it.
36    pub ef: Option<usize>,
37    /// The distance metric used to rank candidates.
38    pub metric: DistanceMetric,
39    /// Optional metadata predicate restricting which records are eligible.
40    pub filter: Option<Filter>,
41}
42
43impl SearchParams {
44    /// Creates parameters for a top-`k` search under `metric`, with no search
45    /// breadth and no filter.
46    ///
47    /// # Examples
48    ///
49    /// ```
50    /// use iqdb_types::{DistanceMetric, SearchParams};
51    ///
52    /// let params = SearchParams::new(5, DistanceMetric::Euclidean);
53    /// assert_eq!(params.k, 5);
54    /// assert_eq!(params.ef, None);
55    /// assert!(params.filter.is_none());
56    /// ```
57    #[inline]
58    #[must_use]
59    pub fn new(k: usize, metric: DistanceMetric) -> Self {
60        Self {
61            k,
62            ef: None,
63            metric,
64            filter: None,
65        }
66    }
67}