{"record":{"id":"cecf7653cc0188f7","repo":"Tencent/WeKnora","slug":"failed-to-get-messages-by-knowledge-ids-w","errorCode":null,"errorMessage":"failed to get messages by knowledge IDs: %w","messagePattern":"failed to get messages by knowledge IDs: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/application/service/message.go","lineNumber":666,"sourceCode":"\n\t// Rerank results if a rerank model is configured\n\tkbResults = s.rerankResults(ctx, rc, params.Query, kbResults)\n\tif len(kbResults) == 0 {\n\t\treturn nil, nil\n\t}\n\n\t// Map KB search results back to messages via knowledge_id\n\tknowledgeIDs := make([]string, 0, len(kbResults))\n\tscoreByKnowledgeID := make(map[string]float64)\n\tfor _, r := range kbResults {\n\t\tknowledgeIDs = append(knowledgeIDs, r.KnowledgeID)\n\t\tscoreByKnowledgeID[r.KnowledgeID] = r.Score\n\t}\n\n\t// Look up messages by their knowledge_id\n\tmessages, err := s.messageRepo.GetMessagesByKnowledgeIDs(ctx, knowledgeIDs)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to get messages by knowledge IDs: %w\", err)\n\t}\n\n\t// Filter by session IDs if specified\n\tsessionFilter := make(map[string]bool)\n\tfor _, sid := range params.SessionIDs {\n\t\tsessionFilter[sid] = true\n\t}\n\n\tvar results []*types.MessageSearchResultItem\n\tfor _, msg := range messages {\n\t\tif len(sessionFilter) > 0 && !sessionFilter[msg.SessionID] {\n\t\t\tcontinue\n\t\t}\n\t\tscore := scoreByKnowledgeID[msg.KnowledgeID]\n\t\tresults = append(results, &types.MessageSearchResultItem{\n\t\t\tMessageWithSession: *msg,\n\t\t\tScore:              score,\n\t\t\tMatchType:          \"vector\",","sourceCodeStart":648,"sourceCodeEnd":684,"githubUrl":"https://github.com/Tencent/WeKnora/blob/988cbb03305e055d8ebb7d46d9ac6cc0803cd074/internal/application/service/message.go#L648-L684","documentation":"After KB hybrid search returns results, the service maps knowledge IDs back to chat messages via messageRepo.GetMessagesByKnowledgeIDs. A failure in that repository lookup is wrapped here, so KB hits cannot be converted into message results.","triggerScenarios":"vectorSearchViaKB (from SearchMessages) when the messages-table query by knowledge IDs fails — DB connection error, timeout, oversized ID list, or missing table/column after migration.","commonSituations":"Large result sets from the KB producing a huge ID list that trips DB parameter limits; DB outage; schema drift where knowledge_id column/index is missing.","solutions":["Check the wrapped repo error for the concrete DB failure.","Cap or chunk the knowledgeIDs list sent to GetMessagesByKnowledgeIDs.","Verify the knowledge_id column and index exist (run pending migrations).","Retry after transient DB issues; the lookup is read-only."],"exampleFix":"// before\nmessages, err := s.messageRepo.GetMessagesByKnowledgeIDs(ctx, knowledgeIDs)\nif err != nil {\n    return nil, fmt.Errorf(\"failed to get messages by knowledge IDs: %w\", err)\n}\n// after\nif len(knowledgeIDs) > 500 {\n    knowledgeIDs = knowledgeIDs[:500]\n}\nmessages, err := s.messageRepo.GetMessagesByKnowledgeIDs(ctx, knowledgeIDs)\nif err != nil {\n    return nil, fmt.Errorf(\"failed to get messages by knowledge IDs: %w\", err)\n}","handlingStrategy":"try-catch","validationCode":"if len(knowledgeIDs) == 0 { return nil, nil } // nothing to look up","typeGuard":null,"tryCatchPattern":"msgs, err := svc.SearchMessages(ctx, params)\nif err != nil && strings.Contains(err.Error(), \"messages by knowledge IDs\") {\n    if isTransient(err) { /* retry once */ } else { log.Error(err) }\n}","preventionTips":["Cap KB result count so knowledgeIDs stays within DB parameter limits","Ensure knowledge_id column/index migrations are applied","Alert on GetMessagesByKnowledgeIDs error rates"],"tags":["database","search","knowledge-base"],"backgroundTag":"kb-message-lookup-failed","analyzedSha":"988cbb03305e055d8ebb7d46d9ac6cc0803cd074","analyzedAt":"2026-09-02T14:41:08.344Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}