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}