1

我正在编写一个日志应用程序,并且使用 RavenDB 作为数据存储。我们有很多基于文本的日志记录,并且希望能够利用 RavenDB 的索引功能来搜索它。

我开始像这样编写我的文档实现:

public class LogEntry 
{
  public DateTime Date {get;set;}
  public string Message {get;set;}
}

public class Information : LogEntry {}

public class Error : LogEntry {}

我这样做是为了让 UI 为不同的日志级别显示不同的集合,但是,在考虑了更多之后,我只会使用 UI 来查询日志。

由于 RavenDB 在后台将所有文档都存储在相同的位置,因此最好只使用一个LogEntry公开严重级别属性的文档,然后创建多个按严重级别对文档集合进行分组的索引吗?

public class LogEntry
{
  public DateTime Date {get;set;}
  public string Message {get;set;}
  public string Severity {get;set;}
}
4

1 回答 1

0

我会创建一个类,但是对于Severity一个enum类型呢?RavenDB 会将枚举存储为字符串,因此不会对性能产生任何影响。但是您将受益于避免拼写错误并在您的 .Net 代码中使用 Intellisense。

你应该只有一个索引,而不是倍数。您的地图应该包含您想要排序或过滤的任何字段,因此您可能会映射所有三个字段DateMessageSeverity

您可能还想考虑Message在索引中将该字段标记为“已分析”。这将允许对您的日志消息进行全文搜索。

public enum Severity
{
    Debug,
    Info,
    Warning,
    Error
}

public class LogEntry
{
    public DateTime Date { get; set; }
    public string Message { get; set; }
    public Severity Severity { get; set; }
}

public class LogEntriesIndex : AbstractIndexCreationTask<LogEntry>
{
    public LogEntriesIndex()
    {
        Map = entries => from entry in entries
                         select new
                         {
                             entry.Date,
                             entry.Message,
                             entry.Severity
                         }

        Index(x => x.Message, FieldIndexing.Analyzed);
    }
}
于 2013-07-11T22:23:51.653 回答