agentroot_core/search/
mod.rs

1//! Search engine module
2//!
3//! Provides:
4//! - BM25 full-text search via FTS5
5//! - Vector similarity search via sqlite-vec
6//! - Hybrid search with RRF fusion
7
8mod bm25;
9mod hybrid;
10mod smart;
11mod snippet;
12mod vector;
13
14pub use hybrid::*;
15pub use smart::smart_search;
16pub use snippet::*;
17
18/// Search options
19#[derive(Debug, Clone)]
20pub struct SearchOptions {
21    /// Maximum number of results
22    pub limit: usize,
23    /// Minimum score threshold (0.0 - 1.0)
24    pub min_score: f64,
25    /// Filter by collection name
26    pub collection: Option<String>,
27    /// Filter by provider type (e.g., "file", "github")
28    pub provider: Option<String>,
29    /// Include full document content
30    pub full_content: bool,
31}
32
33impl Default for SearchOptions {
34    fn default() -> Self {
35        Self {
36            limit: 20,
37            min_score: 0.0,
38            collection: None,
39            provider: None,
40            full_content: false,
41        }
42    }
43}
44
45use crate::db::UserMetadata;
46
47/// Search result
48#[derive(Debug, Clone)]
49pub struct SearchResult {
50    pub filepath: String,
51    pub display_path: String,
52    pub title: String,
53    pub hash: String,
54    pub collection_name: String,
55    pub modified_at: String,
56    pub body: Option<String>,
57    pub body_length: usize,
58    pub docid: String,
59    pub context: Option<String>,
60    pub score: f64,
61    pub source: SearchSource,
62    pub chunk_pos: Option<usize>,
63    pub llm_summary: Option<String>,
64    pub llm_title: Option<String>,
65    pub llm_keywords: Option<Vec<String>>,
66    pub llm_category: Option<String>,
67    pub llm_difficulty: Option<String>,
68    pub user_metadata: Option<UserMetadata>,
69}
70
71/// Source of search result
72#[derive(Debug, Clone, Copy, PartialEq, Eq)]
73pub enum SearchSource {
74    Bm25,
75    Vector,
76    Hybrid,
77}