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 为空。

4

1 回答 1

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
....

现在 nest 将使用PackageRecordtype 来构建搜索但CustomPacakgeRecordSearchHit反序列化命中:

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

根据您的 json 的大小,这可能是也可能不是过早的优化,因此请确保f.List_BorrowerSet作为字段返回会产生巨大的开销。

于 2013-12-22T20:43:32.887 回答