Search 搜索知识
(ctx context.Context, query *SearchQuery)
| 448 | |
| 449 | // Search 搜索知识 |
| 450 | func (m *manager) Search(ctx context.Context, query *SearchQuery) ([]*SearchResult, error) { |
| 451 | if query == nil { |
| 452 | return nil, errors.New("knowledge: search query cannot be nil") |
| 453 | } |
| 454 | |
| 455 | // 轻量路径:仅使用向量检索,避开复杂策略 |
| 456 | if m.corePipeline != nil && (query.Strategy == "" || query.Strategy == StrategyVector) { |
| 457 | meta := map[string]any{} |
| 458 | maps.Copy(meta, query.Filters) |
| 459 | if query.Namespace != "" { |
| 460 | meta["namespace"] = query.Namespace |
| 461 | } |
| 462 | hits, err := m.corePipeline.Search(ctx, query.Query, query.MaxResults, meta) |
| 463 | if err != nil { |
| 464 | return nil, fmt.Errorf("knowledge: core search failed: %w", err) |
| 465 | } |
| 466 | return convertCoreHits(hits), nil |
| 467 | } |
| 468 | |
| 469 | m.mu.RLock() |
| 470 | defer m.mu.RUnlock() |
| 471 | |
| 472 | // 设置默认值 |
| 473 | if query.MaxResults == 0 { |
| 474 | query.MaxResults = m.config.MaxResults |
| 475 | } |
| 476 | if query.Namespace == "" { |
| 477 | query.Namespace = m.config.Namespace |
| 478 | } |
| 479 | |
| 480 | var results []*SearchResult |
| 481 | var err error |
| 482 | |
| 483 | // 根据策略执行搜索 |
| 484 | switch query.Strategy { |
| 485 | case StrategyText: |
| 486 | results, err = m.searchText(ctx, query) |
| 487 | case StrategyVector: |
| 488 | results, err = m.searchVector(ctx, query) |
| 489 | case StrategyHybrid: |
| 490 | results, err = m.searchHybrid(ctx, query) |
| 491 | case StrategyGraph: |
| 492 | results, err = m.searchGraph(ctx, query) |
| 493 | default: |
| 494 | // 默认使用混合搜索 |
| 495 | query.Strategy = StrategyHybrid |
| 496 | results, err = m.searchHybrid(ctx, query) |
| 497 | } |
| 498 | |
| 499 | if err != nil { |
| 500 | return nil, fmt.Errorf("knowledge: search failed: %w", err) |
| 501 | } |
| 502 | |
| 503 | // 应用过滤器 |
| 504 | results = m.applyFilters(results, query) |
| 505 | |
| 506 | // 限制结果数量 |
| 507 | if len(results) > query.MaxResults { |
no test coverage detected