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

1""" 

2Paper Search (Qdrant) 

3 

4Purpose: 

5- Semantic search over medical research papers 

6- Return LLM-ready paper context 

7""" 

8 

9from typing import List, Dict, Any 

10 

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 

15 

16logger = get_logger(__name__) 

17 

18 

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 """ 

26 

27 client = get_client() 

28 logger.info("Searching papers", extra={"query": query}) 

29 

30 query_vector = embed_texts([query])[0] 

31 

32 response = client.query_points( 

33 collection_name=COLLECTION, 

34 query=query_vector, 

35 limit=top_k, 

36 with_payload=True, 

37 ) 

38 

39 papers = [] 

40 

41 for hit in response.points: 

42 payload = hit.payload or {} 

43 

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 ) 

56 

57 logger.info("Paper search completed", extra={"results": len(papers)}) 

58 return papers