swiftide_core/search_strategies/
hybrid_search.rs1use derive_builder::Builder;
2
3use crate::{indexing::EmbeddedField, querying};
4
5use super::{DEFAULT_TOP_K, DEFAULT_TOP_N};
6
7#[derive(Debug, Clone, Builder)]
12#[builder(setter(into))]
13pub struct HybridSearch {
14    #[builder(default)]
16    top_k: u64,
17    #[builder(default)]
19    top_n: u64,
20
21    #[builder(default)]
23    dense_vector_field: EmbeddedField,
24
25    #[builder(default)]
28    sparse_vector_field: EmbeddedField,
29}
30
31impl querying::SearchStrategy for HybridSearch {}
32
33impl Default for HybridSearch {
34    fn default() -> Self {
35        Self {
36            top_k: DEFAULT_TOP_K,
37            top_n: DEFAULT_TOP_N,
38            dense_vector_field: EmbeddedField::Combined,
39            sparse_vector_field: EmbeddedField::Combined,
40        }
41    }
42}
43
44impl HybridSearch {
45    pub fn with_top_k(&mut self, top_k: u64) -> &mut Self {
47        self.top_k = top_k;
48        self
49    }
50    pub fn top_k(&self) -> u64 {
52        self.top_k
53    }
54    pub fn with_top_n(&mut self, top_n: u64) -> &mut Self {
57        self.top_n = top_n;
58        self
59    }
60    pub fn top_n(&self) -> u64 {
62        self.top_n
63    }
64    pub fn with_dense_vector_field(
68        &mut self,
69        dense_vector_field: impl Into<EmbeddedField>,
70    ) -> &mut Self {
71        self.dense_vector_field = dense_vector_field.into();
72        self
73    }
74
75    pub fn dense_vector_field(&self) -> &EmbeddedField {
77        &self.dense_vector_field
78    }
79    pub fn with_sparse_vector_field(
83        &mut self,
84        sparse_vector_field: impl Into<EmbeddedField>,
85    ) -> &mut Self {
86        self.sparse_vector_field = sparse_vector_field.into();
87        self
88    }
89
90    pub fn sparse_vector_field(&self) -> &EmbeddedField {
92        &self.sparse_vector_field
93    }
94}