# Change: Real BM25 hybrid search and drop legacy SDK path ## Why Delivery 2 shipped application-layer multi-path + sparse-lite lexical ranking. Product requirement is **true dense + BM25 hybrid retrieval**. Legacy `MilvusServiceClient` search path will be abandoned in this change; keep a single knowledge vector backend based on Milvus Java SDK v2 (`MilvusClientV2`) with BM25 function + `hybridSearch` + RRF. ## What Changes - New hybrid collection schema: dense float vector + analyzed text + sparse BM25 output - Write path inserts text for BM25 auto-sparsification and dense embedding - Search path: single backend - dense mode: dense ANN only - hybrid mode: dense ANN + BM25 sparse ANN fused by RRFRanker - Remove/disable legacy SDK `search` / `searchSimilarDocumentsWithSdk` knowledge path and mode routing (`sdk|spring|auto`) - KnowledgeSearchPort adapter calls the single backend - Config: collection name, search mode, rrf-k, path weights optional - Tests for store mapping/fusion wiring; no dependency on live Zilliz in unit tests ## Non-goals - Automatic full production reindex job UI - Cross-encoder model rerank - Keeping dual Spring-AI + SDK knowledge search modes ## Impact - **Breaking for existing `biz` collection**: requires new hybrid collection + reindex - Agent tool contract unchanged - Interface: L2 internal retrieval backend ## Depends on - Delivery 1 chunk identity - Delivery 2 SearchPort (will replace sparse-lite hybrid implementation)