Skip to main content

seekr_code/search/
mod.rs

1//! Search engine module.
2//!
3//! Provides text regex search, semantic vector search, AST pattern search,
4//! and RRF fusion ranking across multiple search backends.
5
6pub mod ast_pattern;
7pub mod fusion;
8pub mod semantic;
9pub mod text;
10
11use crate::parser::CodeChunk;
12
13/// Search mode selection.
14#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
15#[serde(rename_all = "lowercase")]
16pub enum SearchMode {
17    /// Regex text search.
18    Text,
19    /// Semantic vector search.
20    Semantic,
21    /// AST pattern search (function signatures).
22    Ast,
23    /// Hybrid: combine text + semantic results via RRF fusion.
24    Hybrid,
25}
26
27/// A search query.
28#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
29pub struct SearchQuery {
30    /// The query string.
31    pub query: String,
32
33    /// Search mode.
34    pub mode: SearchMode,
35
36    /// Maximum number of results to return.
37    pub top_k: usize,
38
39    /// Project path to search in.
40    pub project_path: String,
41}
42
43/// A single search result.
44#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
45pub struct SearchResult {
46    /// The matched code chunk.
47    pub chunk: CodeChunk,
48
49    /// Relevance score (higher is better).
50    pub score: f32,
51
52    /// Which search mode produced this result.
53    pub source: SearchMode,
54
55    /// Matched line numbers (for text search).
56    pub matched_lines: Vec<usize>,
57}
58
59/// Aggregated search response.
60#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
61pub struct SearchResponse {
62    /// Search results, sorted by relevance.
63    pub results: Vec<SearchResult>,
64
65    /// Total number of results before top-k truncation.
66    pub total: usize,
67
68    /// Search duration in milliseconds.
69    pub duration_ms: u64,
70
71    /// The query that was executed.
72    pub query: SearchQuery,
73}
74
75impl std::fmt::Display for SearchMode {
76    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
77        match self {
78            SearchMode::Text => write!(f, "text"),
79            SearchMode::Semantic => write!(f, "semantic"),
80            SearchMode::Ast => write!(f, "ast"),
81            SearchMode::Hybrid => write!(f, "hybrid"),
82        }
83    }
84}
85
86impl std::str::FromStr for SearchMode {
87    type Err = String;
88
89    fn from_str(s: &str) -> Result<Self, Self::Err> {
90        match s.to_lowercase().as_str() {
91            "text" => Ok(SearchMode::Text),
92            "semantic" => Ok(SearchMode::Semantic),
93            "ast" => Ok(SearchMode::Ast),
94            "hybrid" => Ok(SearchMode::Hybrid),
95            _ => Err(format!(
96                "Unknown search mode: '{}'. Use: text, semantic, ast, hybrid",
97                s
98            )),
99        }
100    }
101}