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 として含まれています。

4

1 に答える 1

2

Elasticsearchを指定する.Fields()と、常にフィールドの選択がキーと値のペアとして返されます。つまり、次のようになります。

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

これで、ネストは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 に答える