我有以下查询
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。
答案 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
作为一个字段会产生一个重要的开销。