# NV3 — Generic semantic search on the new embedding subsystem This phase keeps the new embedding subsystem parallel to the legacy flow and plugs semantic retrieval into the generic search architecture. ## Scope - query embeddings are generated through `at.procon.dip.embedding.service.QueryEmbeddingService` - semantic search uses `DOC.doc_embedding` - retrieval joins `DOC.doc_text_representation` and `DOC.doc_document` - chunk-aware document collapse remains in the generic search fusion layer - no structured TED/mail search in this phase - no legacy cutover in this phase ## Main classes - `at.procon.dip.search.service.SemanticQueryEmbeddingService` - `at.procon.dip.search.engine.semantic.PgVectorSemanticSearchEngine` - `at.procon.dip.search.repository.DocumentSemanticSearchRepository` ## Query model selection Order of precedence: 1. `SearchRequest.semanticModelKey` 2. `dip.embedding.default-query-model` The selected model is ensured in `DOC.doc_embedding_model` through `EmbeddingModelCatalogService` before the query runs. ## Search flow 1. planner includes `PGVECTOR_SEMANTIC` for `SEMANTIC` or `HYBRID` 2. `SemanticQueryEmbeddingService` builds a query vector 3. `DocumentSemanticSearchRepository` searches `DOC.doc_embedding` 4. generic fusion/collapse merges semantic hits with lexical hits ## Notes - the SQL uses `public.vector` explicitly in casts to avoid search-path related surprises - the repository returns representation metadata (`representation_type`, chunk offsets, etc.) - `SearchRequest.semanticModelKey` is optional and keeps the API model-aware without forcing users to choose a model for every request