如何从搜索中返回有限的字段?

时间:2013-12-19 20:46:54

标签: elasticsearch nest

我有以下查询

    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。

1 个答案:

答案 0 :(得分: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的大小,这可能是也可能不是一个过早的最优化,所以确保返回f.List_BorrowerSet作为一个字段会产生一个重要的开销。