Run a vector similarity search using the embedding store. Returns list of ``(node_id, similarity_score)`` tuples. Gracefully returns an empty list if embeddings are not available.
(
store: GraphStore,
query: str,
limit: int = 50,
model: str | None = None,
provider: str | None = None,
)
| 210 | |
| 211 | |
| 212 | def _embedding_search( |
| 213 | store: GraphStore, |
| 214 | query: str, |
| 215 | limit: int = 50, |
| 216 | model: str | None = None, |
| 217 | provider: str | None = None, |
| 218 | ) -> list[tuple[int, float]]: |
| 219 | """Run a vector similarity search using the embedding store. |
| 220 | |
| 221 | Returns list of ``(node_id, similarity_score)`` tuples. |
| 222 | Gracefully returns an empty list if embeddings are not available. |
| 223 | """ |
| 224 | try: |
| 225 | from .embeddings import EmbeddingStore |
| 226 | except ImportError: |
| 227 | return [] |
| 228 | |
| 229 | try: |
| 230 | emb_store = EmbeddingStore(store.db_path, provider=provider, model=model) |
| 231 | try: |
| 232 | if not emb_store.available or emb_store.count() == 0: |
| 233 | return [] |
| 234 | |
| 235 | results = emb_store.search(query, limit=limit) |
| 236 | # Map qualified names back to node IDs |
| 237 | id_scores: list[tuple[int, float]] = [] |
| 238 | for qn, score in results: |
| 239 | node = store.get_node(qn) |
| 240 | if node: |
| 241 | id_scores.append((node.id, score)) |
| 242 | return id_scores |
| 243 | finally: |
| 244 | emb_store.close() |
| 245 | except Exception as e: |
| 246 | logger.warning("Embedding search failed: %s", e) |
| 247 | return [] |
| 248 | |
| 249 | |
| 250 | # --------------------------------------------------------------------------- |
no test coverage detected