Search 统一搜索接口
(eid int64, req *SearchRequest, userID *int64)
| 171 | |
| 172 | // Search 统一搜索接口 |
| 173 | func (s *SearchService) Search(eid int64, req *SearchRequest, userID *int64) (*SearchResponse, error) { |
| 174 | startTime := time.Now() |
| 175 | |
| 176 | if req == nil { |
| 177 | return nil, fmt.Errorf("搜索请求不能为空") |
| 178 | } |
| 179 | |
| 180 | // 设置默认值 |
| 181 | if req.TopK <= 0 { |
| 182 | req.TopK = 10 |
| 183 | } |
| 184 | if req.SearchType == "" { |
| 185 | req.SearchType = "vector" |
| 186 | } |
| 187 | |
| 188 | originalReq := cloneSearchRequest(req) |
| 189 | if originalReq == nil { |
| 190 | originalReq = &SearchRequest{} |
| 191 | } |
| 192 | searchTrace := newSearchTimingRecorder() |
| 193 | originalReq.trace = searchTrace |
| 194 | configService := NewChunkConfigService(s.db) |
| 195 | narrowedReq := cloneSearchRequest(originalReq) |
| 196 | if narrowedReq == nil { |
| 197 | narrowedReq = &SearchRequest{} |
| 198 | } |
| 199 | entityMeta := &entityScopeNarrowMeta{} |
| 200 | scopeNarrowStart := time.Now() |
| 201 | if !narrowedReq.SkipEntityScopeNarrowing { |
| 202 | var narrowErr error |
| 203 | entityMeta, narrowErr = s.applyEntityScopeNarrowingWithMeta(eid, narrowedReq) |
| 204 | if narrowErr != nil { |
| 205 | logger.SysDebugf("【实体范围】实体收窄失败,回退原始请求: eid=%d, err=%v", eid, narrowErr) |
| 206 | narrowedReq = cloneSearchRequest(originalReq) |
| 207 | if narrowedReq == nil { |
| 208 | narrowedReq = &SearchRequest{} |
| 209 | } |
| 210 | entityMeta = &entityScopeNarrowMeta{} |
| 211 | } |
| 212 | } else { |
| 213 | logger.SysDebugf("【实体范围】跳过实体收窄: eid=%d, query=%q, file_count=%d", |
| 214 | eid, truncateForDebug(narrowedReq.Query, 256), len(narrowedReq.FileIDs)) |
| 215 | } |
| 216 | searchTrace.add("scope_narrowing_ms", time.Since(scopeNarrowStart)) |
| 217 | if entityMeta == nil { |
| 218 | entityMeta = &entityScopeNarrowMeta{} |
| 219 | } |
| 220 | |
| 221 | effectiveReq := normalizeSearchRequestForExecution(narrowedReq) |
| 222 | if effectiveReq == nil { |
| 223 | effectiveReq = &SearchRequest{} |
| 224 | } |
| 225 | |
| 226 | logger.SysDebugf( |
| 227 | "【实体范围】摘要: eid=%d, 种子实体数=%d, 分片候选数=%d, 请求内容=%q, 检索类型=%s, 取回数量=%d, 文件数=%d, 分片数=%d", |
| 228 | eid, |
| 229 | len(entityMeta.SeedEntities), |
| 230 | entityMeta.ChunkCandidateCount, |
no test coverage detected