2013-12-19 26 views
1

我有以下查詢如何從搜索中返回有限的字段?

var searchResult = _Db.Search<PackageRecord>(s => s 
     .Index(user.Tenant.Id.ToString()) 
     .Type("Package") 
     .From(request.Page) 
     .Size(_DefaultPageSize) 

     .Query(q => q.Nested(n => n 
      .Path ( f => f.List_BorrowerSet[0]) 
      .Query(qm => qm.QueryString(qs => qs 
       .OnFields ( 
     f => f.List_BorrowerSet.First().PrimaryBorrower.ContactDetails.Name_Fist, 
     f => f.List_BorrowerSet.First().PrimaryBorrower.ContactDetails.Name_Last 
     ) 
       .Query (request.BorrowerName)) 
        && qm 
       .Term ( 
       f => f.List_BorrowerSet.First().PrintPosition , 0) 
       ))) 

     .Fields(
     f => f.Id, 
     f=> f.List_BorrowerSet[0].PrimaryBorrower.ContactDetails.Name_Fist, 
     f=> f.List_BorrowerSet[0].PrimaryBorrower.ContactDetails.Name_Last 
     ) 

     ); 

我怎樣才能只用有限的領域,結果呢?我看到一個文檔並命中,但它們的對象將List_BorrowerSet設置爲null。

回答

2

當您指定.Fields() elasticsearch總是會返回字段選擇作爲鍵值對,即:

"fields" { 
    "list_borrowerSet.primaryBorrow.contactDetails.name_Last" : ["Martijn"], 
    "list_borrowerSet.primaryBorrow.contactDetails.name_Fist" : ["Laarman"] 
} 

JSON.NET因而NEST並不完全知道如何反序列化這些回一個PackageRecord

如果你只選擇f.List_BorrowerSet那麼NEST/JSON.NET可以正確地反序列化它PackageRecord

你最好指定您的搜索作爲其次:

var searchResult = _Db.Search<PackageRecord,CustomPackageRecordSearchHit>(s => s 
.... 

現在,鳥巢將使用PackageRecord類型構建搜索,但CustomPacakgeRecordSearchHit反序列化命中:

public class CustomPackageRecordSearchHit 
{ 
    [JsonProperty("list_borrowerSet.primaryBorrow.contactDetails.name_Fist")] 
    public IEnumerable<string> BorrowersFirstNames { get; set; } 
} 

根據您的JSON的大小,這可能會或可能不會過早optimalization所以確保返回f.List_BorrowerSet作爲一個字段招致重大開銷。

+0

搜索()似乎並不存在。 –

+0

它沒有在'IElasticClient'上定義,所以你不得不在'ElasticClient'上對我的部分進行巨大的監督:(我正在努力將'IElasticClient'變成我希望在'api-changes'分支中的形狀下一個版本,即每個調用都有一個* Async變體,並且支持更多描述符的重載較少。 –

相關問題