【问题标题】:How do you get search results returned in nest 1.x mapped to an object?如何将嵌套 1.x 中返回的搜索结果映射到对象?
【发布时间】:2014-08-20 23:46:31
【问题描述】:

我正在嵌套中创建查询

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 )

    );

这会返回 6 个命中但没有文档。我查看了命中结果,但我不知道在使用时如何处理缺失的 /null 字段

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 ()
    } );
}

将我的搜索结果映射到PackageRecordSearchHit 对象的正确方法是什么?

【问题讨论】:

  • 你解决了吗?我将通过 Web API 将结果作为响应内容返回,因此我需要获取 SearchResult 对象并提取对象 Ts 的集合以打包为列表。
  • 这很烦人,但我只需要添加一堆空值检查。

标签: c# nest


【解决方案1】:

您不会像看到的那样取回 DOCUMENTs。你只会得到 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();
        }    

【讨论】:

  • 最后,简单解释一下取回 Documents 和取回 Hits 的区别。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2015-07-30
  • 1970-01-01
  • 2021-06-09
  • 2021-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-08
相关资源
最近更新 更多