Coverage for src/qdrant_loader_mcp_server/search/engine/search.py: 95%
19 statements
« prev ^ index » next coverage.py v7.10.6, created at 2025-09-08 06:06 +0000
« prev ^ index » next coverage.py v7.10.6, created at 2025-09-08 06:06 +0000
1"""
2Search Operations - Main Search Functionality.
4This module implements the core search operations including
5basic document search using the hybrid search engine.
6"""
8from typing import TYPE_CHECKING
10if TYPE_CHECKING:
11 from .core import SearchEngine
13from ...utils.logging import LoggingConfig
14from ..components.models.hybrid import HybridSearchResult
16logger = LoggingConfig.get_logger(__name__)
19class SearchOperations:
20 """Handles core search operations."""
22 def __init__(self, engine: "SearchEngine"):
23 """Initialize with search engine reference."""
24 self.engine = engine
26 async def search(
27 self,
28 query: str,
29 source_types: list[str] | None = None,
30 limit: int = 5,
31 project_ids: list[str] | None = None,
32 ) -> list[HybridSearchResult]:
33 """Search for documents using hybrid search.
35 Args:
36 query: Search query text
37 source_types: Optional list of source types to filter by
38 limit: Maximum number of results to return
39 project_ids: Optional list of project IDs to filter by
40 """
41 hybrid = getattr(self.engine, "hybrid_search", None)
42 if not hybrid:
43 raise RuntimeError("Search engine not initialized")
45 logger.debug(
46 "Performing search",
47 query=query,
48 source_types=source_types,
49 limit=limit,
50 project_ids=project_ids,
51 )
53 try:
54 results = await hybrid.search(
55 query=query,
56 source_types=source_types,
57 limit=limit,
58 project_ids=project_ids,
59 )
61 logger.info(
62 "Search completed",
63 query=query,
64 result_count=len(results),
65 project_ids=project_ids,
66 )
68 return results
69 except Exception as e:
70 logger.error("Search failed", error=str(e), query=query)
71 raise