gpt4 book ai didi

c# - 如何将 nest 1.x 中返回的搜索结果映射到一个对象?

转载 作者:太空狗 更新时间:2023-10-30 01:03:58 26 4
gpt4 key购买 nike

我正在嵌套中创建查询

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 对象的正确方法是什么?

最佳答案

您不会像您看到的那样取回文档。您只会得到 HIT。这是因为您指定了一组您希望返回的特定字段(因此不会返回实际文档,只会返回指定的字段)

我认为您在新建对象之前对返回的字段进行空检查是正确的做法

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

关于c# - 如何将 nest 1.x 中返回的搜索结果映射到一个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25416216/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com