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

标签 c# elasticsearch nest enumeration

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

相关文章:

c# - 我应该在使用完服务(层)类后处理它吗?

c# - 使另一个类中的方法在完成后调用调用类中的事件?

elasticsearch - 如何在Nest中使用流利的api和属性为geopoint属性创建映射?

elasticsearch - Elasticsearch Nest 是否支持按查询更新

c# - Nest中的MultiGet on过滤器ID

c# - 如何根据 "is-subset"条件有效地修剪列表?

c# - 在 Mono 下隔离非托管崩溃

elasticsearch - 如何使用 RestHighLevelClient 从 Elasticsearch 中的索引中删除所有文档

elasticsearch - Elasticsearch 中的序列号与版本号

elasticsearch - 如何知道哪些关键字在elasticsearch中匹配