1use std::sync::Arc;
2
3use semtree_embed::Embedder;
4use semtree_store::{Hit, VectorStore};
5
6use crate::RagError;
7
8pub struct SearchEngine {
9 embedder: Arc<dyn Embedder>,
10 store: Arc<dyn VectorStore>,
11}
12
13impl SearchEngine {
14 pub fn new(embedder: Arc<dyn Embedder>, store: Arc<dyn VectorStore>) -> Self {
15 Self { embedder, store }
16 }
17
18 pub async fn search(&self, query: &str, top_k: usize) -> Result<Vec<Hit>, RagError> {
19 let embedding = self.embedder.embed_one(query).await?;
20 let hits = self.store.search(&embedding, top_k).await?;
21 Ok(hits)
22 }
23}