How do you get search results returned in nest 1.x mapped to an object?

…衆ロ難τιáo~ 提交于 2019-12-01 19:08:43

问题


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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!