下面的代码在 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/