gpt4 book ai didi

c# - 使用 NEST 6.0 for Elasticsearch 枚举动态命中结果

转载 作者:行者123 更新时间:2023-11-30 14:22:50 25 4
gpt4 key购买 nike

下面的代码在 Nest 6.0 之前工作,用于枚举动态命中结果。但它不再抛出 InvalidCastException

代码:

var response = elasticClient.Search<dynamic>(
s => s.Query(q => q.QueryString(m => m.Query(elasticQueryModel.QueryString))
).Source(src => src.Includes(f => f.Fields(fields))).Size(querySize).AllTypes().Index(elasticQueryModel.Index));
var hits = response.Hits;
var rows = new List<Dictionary<string, object>>();
foreach (var hit in hits)
{
var source = (IDictionary<string, Newtonsoft.Json.Linq.JToken>)hit.Source;
var row = new Dictionary<string, object>();
foreach (var keyValuePair in source)
{
row[keyValuePair.Key] = keyValuePair.Value;
}
rows.Add(row);
}

hit.Source 的有效转换是什么,或者此代码块的其他解决方案?

最佳答案

在 NEST 6.x 中,对 Json.NET 的依赖被 IL 合并并在客户端内部化。这样做的原因有很多,包括:

  • 消除对 Json.NET 的依赖,从而避免在将 NEST 合并到其他已经使用 Json.NET 的项目时与主要版本发生冲突。
  • 在适用于 NEST 类型的序列化约定与您可能拥有的您自己的类型的任何约定之间建立明确的界限
  • 为将来研究替代序列化库/技术奠定基础,例如异步流,ArrayPool<T> , Span<T>

此更改意味着使用 dynamic作为 Search<T>() 上的通用类型将不再以 Json.NET 的 JObject 形式返回源文档, 但将作为内部类型的实例返回 Nest.Json.Linq.JObject .

如果您仍想将 Json.NET 与 NEST 结合使用,那么还有 NEST.JsonNetSerializer nuget package这让你可以 plug in your own serialization based on Json.NET. (由于 NEST 6.x 尚未正式发布,文档仍在进行中)

虽然我认为这里更简单的场景是使用 Dictionary<string, object>作为 Search<T>() 的通用参数

var response = client.Search<Dictionary<string, object>>(s => s
.Query(q => q
.QueryString(m => m
.Query("username")
)
)
.AllTypes()
);

foreach (var hit in response.Hits)
{
foreach (var keyValuePair in hit.Source)
{
// do something
}
}

关于c# - 使用 NEST 6.0 for Elasticsearch 枚举动态命中结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47919978/

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