Как вы получаете результаты поиска, возвращенные в гнезде 1.x, сопоставленные с объектом?

Я создаю запрос в гнезде

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 объектами?


person Aaron Fischer    schedule 20.08.2014    source источник
comment
Вы уже решили это? Я буду возвращать результаты из этого через веб-API в качестве содержимого ответа, поэтому мне нужно будет взять объект SearchResult и извлечь набор объектов T для упаковки в виде списка.   -  person Ellesedil    schedule 03.10.2014
comment
Это раздражает, но мне просто пришлось добавить кучу проверок нулевого значения.   -  person Aaron Fischer    schedule 03.10.2014


Ответы (1)


Вы не получите ДОКУМЕНТЫ обратно, как вы видели. Вы получите только ХИТы обратно. Это связано с тем, что вы указали определенный набор FIELD, который вы хотели вернуть (поэтому фактический документ не возвращается, только указанные поля)

Я думаю, вы поступаете правильно, выполняя нулевые проверки полей, возвращаемых до того, как вы обновите объект.

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();
        }    
person TrampSansTom    schedule 03.02.2015
comment
Наконец, простое объяснение разницы между получением документов и получением обращений. Огромное спасибо. - person Adrian Carr; 31.03.2015