Skip to main content

qex_core/search/
mod.rs

1pub mod bm25;
2#[cfg(feature = "dense")]
3pub mod dense;
4#[cfg(any(feature = "dense", feature = "openai"))]
5pub mod embedding;
6#[cfg(feature = "dense")]
7pub mod hybrid;
8#[cfg(feature = "openai")]
9pub mod openai_embedder;
10pub mod query;
11pub mod ranking;
12
13use crate::chunk::{ChunkType, CodeChunk};
14use serde::{Deserialize, Serialize};
15
16/// A search result with ranking score
17#[derive(Debug, Clone, Serialize, Deserialize)]
18pub struct SearchResult {
19    pub chunk_id: String,
20    pub score: f32,
21    pub content: String,
22    pub file_path: String,
23    pub relative_path: String,
24    pub folder_structure: Vec<String>,
25    pub chunk_type: ChunkType,
26    pub name: Option<String>,
27    pub parent_name: Option<String>,
28    pub start_line: usize,
29    pub end_line: usize,
30    pub language: String,
31    pub docstring: Option<String>,
32    pub tags: Vec<String>,
33}
34
35impl SearchResult {
36    pub fn from_chunk(chunk: &CodeChunk, score: f32) -> Self {
37        Self {
38            chunk_id: chunk.id.clone(),
39            score,
40            content: chunk.content.clone(),
41            file_path: chunk.file_path.clone(),
42            relative_path: chunk.relative_path.clone(),
43            folder_structure: chunk.folder_structure.clone(),
44            chunk_type: chunk.chunk_type.clone(),
45            name: chunk.name.clone(),
46            parent_name: chunk.parent_name.clone(),
47            start_line: chunk.start_line,
48            end_line: chunk.end_line,
49            language: chunk.language.clone(),
50            docstring: chunk.docstring.clone(),
51            tags: chunk.tags.clone(),
52        }
53    }
54}