============================================================ 第四部分:工具函数 ============================================================ FilterResultsByKeyword 根据关键词过滤搜索结果的全局辅助函数
(results []model.SearchResult, keyword string)
| 218 | |
| 219 | // FilterResultsByKeyword 根据关键词过滤搜索结果的全局辅助函数 |
| 220 | func FilterResultsByKeyword(results []model.SearchResult, keyword string) []model.SearchResult { |
| 221 | if keyword == "" { |
| 222 | return results |
| 223 | } |
| 224 | |
| 225 | // 预估过滤后会保留80%的结果 |
| 226 | filteredResults := make([]model.SearchResult, 0, len(results)*8/10) |
| 227 | |
| 228 | // 将关键词转为小写,用于不区分大小写的比较 |
| 229 | lowerKeyword := strings.ToLower(keyword) |
| 230 | |
| 231 | // 将关键词按空格分割,用于支持多关键词搜索 |
| 232 | keywords := strings.Fields(lowerKeyword) |
| 233 | |
| 234 | for _, result := range results { |
| 235 | // 将标题和内容转为小写 |
| 236 | lowerTitle := strings.ToLower(result.Title) |
| 237 | lowerContent := strings.ToLower(result.Content) |
| 238 | |
| 239 | // 检查每个关键词是否在标题或内容中 |
| 240 | matched := true |
| 241 | for _, kw := range keywords { |
| 242 | // 对于所有关键词,检查是否在标题或内容中 |
| 243 | if !strings.Contains(lowerTitle, kw) && !strings.Contains(lowerContent, kw) { |
| 244 | matched = false |
| 245 | break |
| 246 | } |
| 247 | } |
| 248 | |
| 249 | if matched { |
| 250 | filteredResults = append(filteredResults, result) |
| 251 | } |
| 252 | } |
| 253 | |
| 254 | return filteredResults |
| 255 | } |
| 256 | |
| 257 | // ============================================================ |
| 258 | // 第五部分:异步插件基础设施(初始化、工作池、缓存) |
no outgoing calls
no test coverage detected