2013-01-13 65 views
3

請告訴我如何在字典字段上正確進行全文搜索。RavenDB全文搜索字典使用IRavenQueryable

我已經索引的所有翻譯的領域是這樣的:

public class TranTest 
{ 
    public string Id { get; set; } 
    public IDictionary<string, string> Trans1 { get; set; } 
    public IDictionary<string, string> Trans2 { get; set; } 

    //for index queries 
    public IDictionary<string, string> Trans { get; set; } 
} 

public class TranTestIndex : AbstractIndexCreationTask<TranTest> 
{ 
    public TranTestIndex() 
    { 
     Map = docs => 
      from doc in docs 
      select new 
      { 
       _ = doc.Trans1.Select(x => CreateField("Trans_" + x.Key, x.Value)), 
       Trans2 = doc.Trans2.Select(x => CreateField("Trans_" + x.Key, x.Value)), 
       /* etc. */ 
      }; 

     Index("Trans_en", FieldIndexing.Analyzed); 
     Index("Trans_fi", FieldIndexing.Analyzed); 
     /* etc. */ 
    } 
} 

這(查詢語句:Trans_en:(項))返回正確的結果:

var luceneQ = session.Advanced.LuceneQuery<TranTest, TranTestIndex>().Search(x => x.Trans["en"], searchTerms).ToList(); 

但我寧願使用IRavenQueryable API。不幸的API在一個類似的查詢產生InvalidOperationException異常:無法理解如何翻譯「x.Trans.get_Item(‘EN’)」到RavenDB查詢:

var ravenQ = session.Query<TranTest, TranTestIndex>().Search(x => x.Trans["en"], searchTerms); 
results = ravenQ.ToList(); //Exception! 

這是奇怪的,考慮到這完美的作品(翻譯於:Trans_en:「這個術語*」):

session.Query<TranTest, TranTestIndex>().Where(x => x.Trans["en"].StartsWith(searchTerms)) 

我對這個問題的問題:

  1. 我將如何創建廣告多項全文搜索查詢帶有IRavenQueryable linq API的字典字段?
  2. 是否可以將IRavenQueryable和IDocumentQuery合併爲一個查詢?
  3. 是否有另一種/更好的方式來創建索引?
    • 它支持動態地添加新的語言
    • 它支持搜索在具體的語言
    • 搜索應該進行在多個領域

回答

1

你已經發現的錯誤。我已使用these unit tests進行驗證,並將其提交給RavenDB issue tracker

要解決,現在要麼使用Lucene的查詢方法,或(如你在你的第二個問題提到),你可以自定義IRavenQueryable的基本DocumentQuery如下:

session.Query<TranTest, TranTestIndex>() 
     .Customize(x => ((IDocumentQuery<TranTest>) x) 
          .Search(q => q.Trans["en"], searchTerms))