44
55from azure .core .credentials import AzureKeyCredential
66from azure .search .documents import SearchClient
7+ from azure .search .documents .models import VectorizedQuery
78
89
910@dataclass
@@ -15,10 +16,8 @@ class SearchResult:
1516 content : str
1617 source : str
1718 category : str
18- file_name : str
19- word_count : int
19+ file_path : str
2020 score : float
21- created_at : str
2221 metadata : dict
2322
2423
@@ -63,32 +62,35 @@ def search(self, query: str, top: int = 10, search_mode: str = "any") -> list[Se
6362 content = result .get ("content" , "" ),
6463 source = result .get ("source" , "Unknown" ),
6564 category = result .get ("category" , "" ),
66- file_name = result .get ("file_name" , "" ),
67- word_count = result .get ("word_count" , 0 ),
65+ file_path = result .get ("file_path" , "" ),
6866 score = result .get ("@search.score" , 0.0 ),
69- created_at = result .get ("created_at" , "" ),
7067 metadata = {k : v for k , v in result .items () if not k .startswith ("@" )},
7168 )
7269 )
7370
7471 return search_results
7572
76- def semantic_search (self , query : str , top : int = 10 ) -> list [SearchResult ]:
77- """Perform a semantic search using Azure's semantic ranking.
73+ def vector_search (
74+ self , query_vector : list [float ], top : int = 10 , text_query : str | None = None
75+ ) -> list [SearchResult ]:
76+ """Perform a vector search using embeddings.
7877
7978 Args:
80- query: Search query text
79+ query_vector: Query embedding vector (384 dimensions for text-embedding-3-small)
8180 top: Maximum number of results to return
81+ text_query: Optional text query for hybrid search
8282
8383 Returns:
84- List of SearchResult objects with semantic relevance
84+ List of SearchResult objects with vector similarity
8585 """
86+ vector_query = VectorizedQuery (
87+ vector = query_vector , k_nearest_neighbors = top , fields = "content_vector"
88+ )
89+
8690 results = self .client .search (
87- search_text = query ,
91+ search_text = text_query ,
92+ vector_queries = [vector_query ],
8893 top = top ,
89- query_type = "semantic" ,
90- semantic_configuration_name = "default" ,
91- include_total_count = True ,
9294 )
9395
9496 search_results = []
@@ -100,10 +102,8 @@ def semantic_search(self, query: str, top: int = 10) -> list[SearchResult]:
100102 content = result .get ("content" , "" ),
101103 source = result .get ("source" , "Unknown" ),
102104 category = result .get ("category" , "" ),
103- file_name = result .get ("file_name" , "" ),
104- word_count = result .get ("word_count" , 0 ),
105- score = result .get ("@search.reranker_score" , result .get ("@search.score" , 0.0 )),
106- created_at = result .get ("created_at" , "" ),
105+ file_path = result .get ("file_path" , "" ),
106+ score = result .get ("@search.score" , 0.0 ),
107107 metadata = {k : v for k , v in result .items () if not k .startswith ("@" )},
108108 )
109109 )
0 commit comments