Tencent/WeKnora · error

failed to get messages by knowledge IDs: %w

Error message

failed to get messages by knowledge IDs: %w

What it means

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.

Source

Thrown at internal/application/service/message.go:666

	// Rerank results if a rerank model is configured
	kbResults = s.rerankResults(ctx, rc, params.Query, kbResults)
	if len(kbResults) == 0 {
		return nil, nil
	}

	// Map KB search results back to messages via knowledge_id
	knowledgeIDs := make([]string, 0, len(kbResults))
	scoreByKnowledgeID := make(map[string]float64)
	for _, r := range kbResults {
		knowledgeIDs = append(knowledgeIDs, r.KnowledgeID)
		scoreByKnowledgeID[r.KnowledgeID] = r.Score
	}

	// Look up messages by their knowledge_id
	messages, err := s.messageRepo.GetMessagesByKnowledgeIDs(ctx, knowledgeIDs)
	if err != nil {
		return nil, fmt.Errorf("failed to get messages by knowledge IDs: %w", err)
	}

	// Filter by session IDs if specified
	sessionFilter := make(map[string]bool)
	for _, sid := range params.SessionIDs {
		sessionFilter[sid] = true
	}

	var results []*types.MessageSearchResultItem
	for _, msg := range messages {
		if len(sessionFilter) > 0 && !sessionFilter[msg.SessionID] {
			continue
		}
		score := scoreByKnowledgeID[msg.KnowledgeID]
		results = append(results, &types.MessageSearchResultItem{
			MessageWithSession: *msg,
			Score:              score,
			MatchType:          "vector",

View on GitHub (pinned to 988cbb0330)

Solutions

  1. Check the wrapped repo error for the concrete DB failure.
  2. Cap or chunk the knowledgeIDs list sent to GetMessagesByKnowledgeIDs.
  3. Verify the knowledge_id column and index exist (run pending migrations).
  4. Retry after transient DB issues; the lookup is read-only.

Example fix

// before
messages, err := s.messageRepo.GetMessagesByKnowledgeIDs(ctx, knowledgeIDs)
if err != nil {
    return nil, fmt.Errorf("failed to get messages by knowledge IDs: %w", err)
}
// after
if len(knowledgeIDs) > 500 {
    knowledgeIDs = knowledgeIDs[:500]
}
messages, err := s.messageRepo.GetMessagesByKnowledgeIDs(ctx, knowledgeIDs)
if err != nil {
    return nil, fmt.Errorf("failed to get messages by knowledge IDs: %w", err)
}
Defensive patterns

Strategy: try-catch

Validate before calling

if len(knowledgeIDs) == 0 { return nil, nil } // nothing to look up

Try / catch

msgs, err := svc.SearchMessages(ctx, params)
if err != nil && strings.Contains(err.Error(), "messages by knowledge IDs") {
    if isTransient(err) { /* retry once */ } else { log.Error(err) }
}

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


AI-assisted analysis of Tencent/WeKnora@988cbb0330 (2026-09-02). Data as JSON: /api/errors/cecf7653cc0188f7. Report an issue: GitHub.