gpt4 book ai didi

elasticsearch - 您可以使用 NEST 2 从 InnerHits 获得强类型命中吗?

转载 作者:行者123 更新时间:2023-12-01 14:36:47 25 4
gpt4 key购买 nike

我正在使用 NEST 2 客户端对我们的 Elasticsearch 执行查询。

我们有一个查询嵌套文档数组,并使用 .InnerHits() 在结果中包含嵌套文档的匹配项。

有没有办法将 InnerHits 的结果强类型到特定的 POCO 类而不是动态访问结果字段?

最佳答案

就在这里; Here's an example from the integration tests for inner hits ;任何可以返回内部命中的搜索的原则都是相同的

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> { }
  • 每个King有其他列表 King s 谁是国王的敌人。
  • A King有 n Prince child 和
  • 每个Prince有 n Duke child
  • 每个Duke有 n Earl child
  • 每个Earl有 n Baron child

  • 所以,我们有四个降序的父/子关系。每个文档使用的 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.Net JObject类型,带 .Source.As<T>().Documents<T>()使用 JToken.ToObject<T>()在 Json.Net 中执行转换。

    关于elasticsearch - 您可以使用 NEST 2 从 InnerHits 获得强类型命中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38279838/

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