#![cfg_attr(coverage_nightly, coverage(off))]
use super::search_engine::{SearchQuery, SearchResult, SemanticSearchEngine};
use std::collections::HashMap;
use std::path::Path;
use std::process::Command;
use std::sync::Arc;
use trueno_rag::index::BM25Index;
use trueno_rag::{Chunk, ChunkId, DocumentId, SparseIndex};
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum HybridSearchMode {
KeywordOnly,
VectorOnly,
Hybrid,
}
#[derive(Debug, Clone)]
pub struct HybridSearchQuery {
pub query: String,
pub mode: HybridSearchMode,
pub keyword_weight: f64,
pub vector_weight: f64,
pub language_filter: Option<String>,
pub file_pattern: Option<String>,
pub limit: usize,
}
#[derive(Debug, Clone)]
pub struct HybridSearchResult {
pub file_path: String,
pub chunk_name: String,
pub chunk_type: String,
pub language: String,
pub start_line: usize,
pub end_line: usize,
pub keyword_score: f64,
pub vector_score: f64,
pub hybrid_score: f64,
pub snippet: String,
}
#[derive(Debug, Clone)]
pub struct KeywordMatch {
file_path: String,
line_number: usize,
content: String,
}
pub struct HybridSearchEngine {
semantic_engine: Arc<SemanticSearchEngine>,
search_root: std::path::PathBuf,
}
include!("hybrid_search_engine.rs");
include!("hybrid_search_bm25.rs");
include!("hybrid_search_tests.rs");