[英]How do you get search results returned in nest 1.x mapped to an object?
I am creating a query in nest 我在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. 这将返回6次点击但没有文件。 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? 将搜索结果映射到PackageRecordSearchHit
对象的正确方法是什么?
You won't get DOCUMENTs back as you saw. 如你所见,你不会得到文件。 You'll only get HITs back. 你只会得到HIT。 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) 这是因为您指定了要返回的特定FIELD集(因此不返回实际文档,仅指定字段)
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: FWIW在这里是我如何迭代HIT:
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();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.