简体   繁体   English

如何将嵌套1.x中返回的搜索结果映射到对象?

[英]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.

相关问题 使用 NEST 使用 ElasticSearch 2.x 搜索多种类型时,如何获得混合结果? - How do you get mixed results when searching multiple types with ElasticSearch 2.x using NEST? 如何使用NEST获得包含给定子词的搜索结果? - How to get search results that contain given subword with NEST? 从1.x升级后,在Nest / Elastic Search 2.x中创建索引 - CreateIndex in Nest / Elastic Search 2.x after upgrade from 1.x C#Nest Elastic Search通配符查询-未返回结果 - C# Nest Elastic Search Wildcard Query - No Results Returned 如何将预制的查询对象发送到NEST? - How do you send pre-made Query object to NEST? 使用对象初始值设定项NEST 5.x的弹性搜索嵌套动态查询 - Elastic search nest dynamic query with object initializer NEST 5.x Nest-ElasticSearch.Net-如何分割搜索属性返回的FacetFilter命中计数 - Nest - ElasticSearch.Net - How do I split the FacetFilter hit count returned by a search property Nest.Search <T> 如何使用Hits.Fields.FieldValue获得字段值的简短信息 <object,short> - Nest.Search<T> How do I get the field value for a short using Hits.Fields.FieldValue<object,short> 如何使用Elasticsearch NEST使用匹配搜索返回结果? - How do I use Elasticsearch NEST to return results using match search? 无法创建搜索响应对象-我们如何在Nest中模拟搜索响应? - Unable to create a search response object - How do we mock search responses in Nest?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM