namespace ChatRAG.Models
{
///
/// Resultado padronizado de busca vetorial
/// Funciona com qualquer provider (MongoDB, Qdrant, etc.)
///
public class VectorSearchResult
{
///
/// ID único do documento
///
public string Id { get; set; } = string.Empty;
///
/// Título do documento
///
public string Title { get; set; } = string.Empty;
///
/// Conteúdo completo do documento
///
public string Content { get; set; } = string.Empty;
///
/// ID do projeto ao qual pertence
///
public string ProjectId { get; set; } = string.Empty;
///
/// Score de similaridade (0.0 a 1.0, onde 1.0 é idêntico)
///
public double Score { get; set; }
///
/// Embedding vetorial (opcional - nem sempre retornado por performance)
///
public double[]? Embedding { get; set; }
///
/// Metadados adicionais (tags, categoria, autor, etc.)
///
public Dictionary? Metadata { get; set; }
///
/// Data de criação do documento
///
public DateTime CreatedAt { get; set; }
///
/// Data da última atualização
///
public DateTime UpdatedAt { get; set; }
// ========================================
// INFORMAÇÕES DO PROVIDER
// ========================================
///
/// Nome do provider que retornou este resultado (MongoDB, Qdrant, etc.)
///
public string Provider { get; set; } = string.Empty;
///
/// Informações específicas do provider (índices, shards, etc.)
///
public Dictionary? ProviderSpecific { get; set; }
// ========================================
// MÉTODOS DE CONVENIÊNCIA
// ========================================
///
/// Preview do conteúdo (primeiros N caracteres)
///
public string GetContentPreview(int maxLength = 200)
{
if (string.IsNullOrEmpty(Content))
return string.Empty;
if (Content.Length <= maxLength)
return Content;
return Content.Substring(0, maxLength) + "...";
}
///
/// Score formatado como percentual
///
public string GetScorePercentage()
{
return $"{Score:P1}"; // Ex: "85.3%"
}
///
/// Indica se é um resultado relevante (score alto)
///
public bool IsHighRelevance(double threshold = 0.7)
{
return Score >= threshold;
}
///
/// Converte para o modelo atual do sistema (compatibilidade)
///
public TextoComEmbedding ToTextoComEmbedding()
{
return new TextoComEmbedding
{
Id = Id,
Titulo = Title,
Conteudo = Content,
ProjetoId = ProjectId,
Embedding = Embedding
};
}
///
/// Converte do modelo atual do sistema
///
public static VectorSearchResult FromTextoComEmbedding(
TextoComEmbedding texto,
double score = 1.0,
string provider = "Unknown")
{
return new VectorSearchResult
{
Id = texto.Id,
Title = texto.Titulo,
Content = texto.Conteudo,
ProjectId = texto.ProjetoId,
Score = score,
Embedding = texto.Embedding,
Provider = provider,
CreatedAt = DateTime.UtcNow,
UpdatedAt = DateTime.UtcNow
};
}
public override string ToString()
{
return $"{Title} (Score: {GetScorePercentage()}, Provider: {Provider})";
}
}
}