问题
I am creating a query in nest
var searchResult = ( (ElasticClient)_Db ).Search<PackageRecord, PackageRecordSearchHit> ( s => s
.Index ( Db_deals_IndexName )
.Type ( Db_Package_TypeName )
.From ( request.Page * _DefaultPageSize )
.Size ( _DefaultPageSize )
.Query ( q => q
.QueryString ( qs =>qs
.OnFields ( f =>f.TenantId )
.Query ( user.Tenant.Id.ToString () ) )
&&
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_First,
f => f.List_BorrowerSet.First ().PrimaryBorrower.ContactDetails.Name_Last
)
.Query ( request.SearchValue ) )
&& qm
.Term (
f => f.List_BorrowerSet.First ().IsPrimary, true )
) )
||
q.QueryString ( qs =>
qs.OnFields ( f =>
f.Collateral.SubjectProperty.Address.AddressLineText )
.Query ( request.SearchValue ) )
||
q.QueryString ( qs =>
qs.OnFields ( f =>
f.DisplayName )
.Query ( request.SearchValue ) )
)
.Fields (
f => f.Id,
f => f.DisplayName,
f => f.List_BorrowerSet[ 0 ].IsPrimary,
f => f.List_BorrowerSet[ 0 ].PrimaryBorrower.ContactDetails.Name_First,
f => f.List_BorrowerSet[ 0 ].PrimaryBorrower.ContactDetails.Name_Last,
f => f.Collateral.SubjectProperty.Address.AddressLineText
)
.SortAscending ( f => f.List_BorrowerSet.First ().PrimaryBorrower.ContactDetails.Name_Last )
.SortAscending ( f => f.List_BorrowerSet.First ().PrimaryBorrower.ContactDetails.Name_First )
);
This returns 6 hits but no documents. I have looked at the hit results but I can't figure out how to deal with a missing /null field when using
foreach ( var hit in searchResult.Hit)
{
response.Hits.Add ( new PackageSearchResultItem ()
{
// Id = hit.Fields.FieldValues<List<Guid>> ( "id" ).FirstOrDefault(),
// DisplayName = hit.Fields.FieldValues<string[]> ( "displayName" ).FirstOrDefault(),
// BorrowerFirstName = hit.Fields.FieldValues<string[]> ( "list_BorrowerSet.primaryBorrower.contactDetails.name_First" ).FirstOrDefault (),
// BorrowerLastName = hit.Fields.FieldValues<string[]> ( "list_BorrowerSet.primaryBorrower.contactDetails.name_Last" ).FirstOrDefault (),
// PropertyAddress = hit.Fields.FieldValues<string[]> ( "collateral.subjectProperty.address.AddressLineText" ).FirstOrDefault ()
} );
}
What is the proper way to get my search results mapped to PackageRecordSearchHit objects?
回答1:
You won't get DOCUMENTs back as you saw. You'll only get HITs back. This is because you specified a specific set of FIELDs that you wanted returned (so the actual document isn't returned, only the fields specified)
I think you are doing the right thing by doing null checks on the fields returned before you new up the object
FWIW here is how I'm iterating over the HITs:
var results = esClient.Search<JObject>(x => x.Index("logs").SortDescending("timeStamp").Fields("message", "timeStamp").Query(q => q.Range(z => z.OnField("timeStamp").GreaterOrEquals(DateTime.UtcNow.AddHours(-24)))).Size(1000).AllTypes());
IList<string> allMessages = new List<string>();
foreach (IHit<JObject> x in results.Hits)
{
var messageValue = x.Fields.FieldValuesDictionary["message"] as JArray;
var dateValue = x.Fields.FieldValuesDictionary["timeStamp"] as JArray;
var message = messageValue[0].ToString();
var timeStamp = dateValue[0].ToString();
}
来源:https://stackoverflow.com/questions/25416216/how-do-you-get-search-results-returned-in-nest-1-x-mapped-to-an-object