我正在编写一个日志记录应用程序,我正在使用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;}
}
答案 0 :(得分:0)
我会创建一个单独的类,但对于Severity
,enum
类型怎么样? RavenDB将枚举存储为字符串,因此它不会对性能产生任何影响。但是,您将获得避免拼写错误并在.Net代码中使用Intellisense的好处。
你应该只有一个索引,而不是倍数。您的地图应包含您要排序或过滤的所有字段,因此您可能会映射所有三个字段Date
,Message
和Severity
。
您可能还需要考虑在索引中将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);
}
}