MCPcopy Create free account
hub / github.com/astercloud/aster / SearchHistory

Method SearchHistory

pkg/session/search.go:55–141  ·  view source on GitHub ↗

SearchHistory 搜索历史消息

(ctx context.Context, opts SearchOptions)

Source from the content-addressed store, hash-verified

53
54// SearchHistory 搜索历史消息
55func (s *Searcher) SearchHistory(ctx context.Context, opts SearchOptions) ([]SearchResult, error) {
56 if opts.Query == "" {
57 return nil, errors.New("search query cannot be empty")
58 }
59
60 if opts.Limit <= 0 {
61 opts.Limit = 20
62 }
63
64 if opts.MatchMode == "" {
65 opts.MatchMode = "contains"
66 }
67
68 // 加载消息
69 messages, err := s.store.LoadMessages(ctx, opts.AgentID)
70 if err != nil {
71 return nil, fmt.Errorf("load messages: %w", err)
72 }
73
74 // 执行搜索
75 results := []SearchResult{}
76 queryLower := strings.ToLower(opts.Query)
77
78 for i, msg := range messages {
79 // 角色过滤
80 if opts.OnlyUser && msg.Role != types.MessageRoleUser {
81 continue
82 }
83 if opts.OnlyAssistant && msg.Role != types.MessageRoleAssistant {
84 continue
85 }
86
87 // 提取文本内容
88 content := extractTextContent(msg)
89 contentLower := strings.ToLower(content)
90
91 // 匹配检查
92 matched := false
93 relevance := 0.0
94
95 switch opts.MatchMode {
96 case "exact":
97 matched = strings.Contains(content, opts.Query)
98 if matched {
99 relevance = 1.0
100 }
101 case "contains":
102 matched = strings.Contains(contentLower, queryLower)
103 if matched {
104 relevance = calculateRelevance(contentLower, queryLower)
105 }
106 case "fuzzy":
107 relevance = fuzzyMatch(contentLower, queryLower)
108 matched = relevance > 0.3
109 }
110
111 if matched {
112 snippet := generateSnippet(content, opts.Query, 150)

Callers 3

SearchAcrossSessionsMethod · 0.95
FindSimilarMessagesMethod · 0.95
demonstrateSearchFunction · 0.95

Calls 6

extractTextContentFunction · 0.85
calculateRelevanceFunction · 0.85
fuzzyMatchFunction · 0.85
generateSnippetFunction · 0.85
sortByRelevanceFunction · 0.85
LoadMessagesMethod · 0.65

Tested by

no test coverage detected