Coverage for app \ vector_store \ paper_search.py: 100%
17 statements
« prev ^ index » next coverage.py v7.13.4, created at 2026-02-24 13:18 +0530
« prev ^ index » next coverage.py v7.13.4, created at 2026-02-24 13:18 +0530
1"""
2Paper Search (Qdrant)
4Purpose:
5- Semantic search over medical research papers
6- Return LLM-ready paper context
7"""
9from typing import List, Dict, Any
11from app.vector_store.qdrant_store import get_client, COLLECTION
12from app.processing.embedding import embed_texts
13from app.utils.logger import get_logger
14from qdrant_client.models import SearchRequest
16logger = get_logger(__name__)
19def search_papers(
20 query: str,
21 top_k: int = 5,
22) -> List[Dict[str, Any]]:
23 """
24 Search medical research papers stored in Qdrant.
25 """
27 client = get_client()
28 logger.info("Searching papers", extra={"query": query})
30 query_vector = embed_texts([query])[0]
32 response = client.query_points(
33 collection_name=COLLECTION,
34 query=query_vector,
35 limit=top_k,
36 with_payload=True,
37 )
39 papers = []
41 for hit in response.points:
42 payload = hit.payload or {}
44 papers.append(
45 {
46 "score": hit.score,
47 "pmid": payload.get("pmid"),
48 "title": payload.get("title"),
49 "journal": payload.get("journal"),
50 "year": payload.get("year"),
51 "section": payload.get("section"),
52 "text_preview": (payload.get("text") or "")[:500],
53 "entities": payload.get("entities"),
54 }
55 )
57 logger.info("Paper search completed", extra={"results": len(papers)})
58 return papers