我在RavenDb中存储了许多命令,它们都实现了ICommand。我希望能够搜索上次修改的和Raven-Entity-Name的元数据。我目前正在对每个命令进行多重映射,如下所示:
public class CommandAuditSearch_Index : AbstractMultiMapIndexCreationTask<CommandAuditSearch_Index.Results>
{
public class Results
{
public string CommandType { get; set; }
public DateTime LastModified { get; set; }
}
public CommandAuditSearch_Index()
{
AddMap<NewEmployeeStartCommand>(employees => employees.Select(x => new
{
CommandType = MetadataFor(x).Value<string>("Raven-Entity-Name"),
LastModified = MetadataFor(x).Value<DateTime>("Last-Modified")
}));
AddMap<EmployeeLeaverCommand>(employees => employees.Select(x => new
{
CommandType = MetadataFor(x).Value<string>("Raven-Entity-Name"),
LastModified = MetadataFor(x).Value<DateTime>("Last-Modified")
}));
Index(results => results.CommandType, FieldIndexing.Analyzed);
}
}
我查询如下:
session.Query<CommandAuditSearch_Index.Results, CommandAuditSearch_Index>()
.Where(x => x.CommandType == commandType && x.LastModified >= DateTime.Today).OfType<ICommand>().ToList();
我知道Raven中已经内置了一个索引来获取Tag(实体名称)和上次修改日期但是我似乎无法弄清楚如何得到结果,因为上面的索引给了我。
任何人都可以指出我在静态索引的正确方向上,我不必为每个我必须查询的命令设置多个映射,这样可以将结果作为ICommands列表吗?
谢谢
水稻
答案 0 :(得分:9)
有几点:
除非您要使用Search
查询方法进行全文搜索,否则无需将字段标记为已分析。如果您只是使用Where
,则分析索引术语没有任何优势。
如果您要在结果中查找元数据值,只需使用GetMetadataFor
从元数据而不是文档数据中获取元数据值。 Reference here
正如你所说,已经有了你需要的索引。查询它的最简单方法是使用LuceneQuery
API。
var tag = documentStore.Conventions.GetTypeTagName(theCommand.GetType());
var results = session.Advanced
.LuceneQuery<ICommand, RavenDocumentsByEntityName>()
.WhereEquals("Tag", tag)
.AndAlso()
.WhereGreaterThanOrEqual("LastModified", DateTime.Today
.ToUniversalTime())
.ToList();
foreach (var result in results)
{
var md = session.Advanced.GetMetadataFor(result);
var entityName = md.Value<string>("Raven-Entity-Name");
var lastModified = md.Value<DateTime>("Last-Modified");
// you can see all the metadata if you like
Debug.WriteLine(md.ToString(Formatting.Indented));
}