2013-03-13 91 views
2

我有一些存儲在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(); 

我知道已經有內置烏鴉獲得標籤(實體名稱索引)和最後修改日期,但我似乎無法弄清楚如何獲得結果,因爲我的指數上面給了我。

任何人都可以指向一個靜態索引的正確方向,在這裏我不需要像上面那樣爲每個我必須查詢的命令提供多個映射,以ICommands列表的形式給出結果?

感謝

水稻

回答

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)); 
    } 
    
+0

非常感謝這個馬特。這正是我正在尋找的。我總是找到你的答案詳細,並解釋清楚。 – Paddy 2013-03-13 14:27:48