我正在使用 NEST 2 客户端对我们的 Elasticsearch 执行查询。
我们有一个查询,用于查询嵌套文档数组,并使用 .InnerHits() 在结果中包含嵌套文档的匹配项。
有没有办法将 InnerHits 的结果强类型化到特定的 POCO 类,而不是动态访问结果字段?
就在这里;这是内部命中集成测试的示例 https://github.com/elastic/elasticsearch-net/blob/2.x/src/Tests/Search/Request/InnerHitsUsageTests.cs;对于任何可以返回内部命中的搜索,原则都是相同的
public interface IRoyal
{
string Name { get; set; }
}
[ElasticsearchType(IdProperty = "Name")]
public abstract class RoyalBase<TRoyal> : IRoyal
where TRoyal : class, IRoyal
{
public string Name { get; set; }
}
public class King : RoyalBase<King>
{
public List<King> Foes { get; set; }
}
public class Prince : RoyalBase<Prince> { }
public class Duke : RoyalBase<Duke> { }
public class Earl : RoyalBase<Earl> { }
public class Baron : RoyalBase<Baron> { }
- Each
King
有一个其他的列表King
谁是国王的敌人。
- A
King
has n Prince
儿童和
- Each
Prince
has n Duke
孩子们
- Each
Duke
has n Earl
孩子们
- Each
Earl
has n Baron
孩子们
因此,我们有四种降序的父/子关系。每个文档使用的 id 是Name
文档上的属性。
使用这种设置的强类型内部命中搜索的一个示例是
var response = client.Search<Duke>(s => s
.Index(index)
.InnerHits(ih => ih
.Type<Earl>("earls", g => g
.Size(5)
.InnerHits(iih => iih
.Type<Baron>("barons")
)
.FielddataFields(p => p.Name)
)
)
);
然后处理响应,演示强类型访问的几种方法
foreach (var hit in response.Hits)
{
// each hit here is a Hit<ILazyDocument> i.e.
// no strongly typed access
var earlHits = hit.InnerHits["earls"].Hits;
// strongly typed access to documents using
// .Documents<T>()
var earls = earlHits.Documents<Earl>();
foreach (var earlHit in earlHits.Hits)
{
// use Source.As<T> to access source strongly typed
var earl = earlHit.Source.As<Earl>().Name;
var baronHits = earlHit.InnerHits["barons"];
// strongly typed access to documents
var baron = baronHits.Documents<Baron>();
// do something with baron documents
}
}
访问响应时需要知道类型,因为客户端不会存储或保留内部命中的名称与 C# 类型的关系。
内部命中在内部反序列化为 Json.NetJObject
类型,与.Source.As<T>()
and .Documents<T>()
using JToken.ToObject<T>()
在 Json.Net 中执行转换。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)