微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ElasticSearch - Nest - 映射嵌套在列表和字典中的命中

如何解决ElasticSearch - Nest - 映射嵌套在列表和字典中的命中

TLDR:如何获取需要放在 source 中的数据,例如时间戳,而不是一百万个列表和字典?

我正在尝试根据此 nest 查询创建 Data 对象。数据来自 MetricBeats,最终出现在我的 response.hits 中的许多嵌套列表和字典中,如您在 JSON 响应中所见。

JSON Response

我通常会使用这种方法直接映射我的命中:

foreach (Hit<Data> item in dataResponse)
{
      Data d = item.source;
}

因为数据隐藏在源头的深处,所以这是行不通的。我无法在搜索请求中使用 Data 对象作为我的类型,这会导致很多问题。

我无法确定问题是我的 metricbeats、elasticsearch 还是 nest 查询的配置导致结果以这种方式结束。

我的搜索方法

var response = await ElasticConnection.Instance.client.SearchAsync<dynamic>(s => s
            .Index("metricbeat-*")
                .Query(q => q
                    .Bool(b => b
                        .Should(sh => sh
                            .Match(c => c
                                .Field("host.network.in.bytes")
                                )
                            )
                        .Filter(f => f
                                .Daterange(dr => dr
                                .Field("@timestamp")
                                .GreaterThanorEquals("Now-5m")
                                )
                            )
                        )
                    )
                .source(src => src
                    .Includes(i => i
                        .Field("host.network.in.bytes")
                        .Field("@timestamp")
                    )
                )
            );

这就是我目前正在使用查询中的数据创建 Data 对象的方法。这显然可以通过一种不同的、更有效的方式来完成。

foreach (Hit<dynamic> item in dataResponse)
                {
                    Dictionary<string,dynamic> test = item.source;
                    test.TryGetValue("host",out var host);
                    Dictionary<string,dynamic> test2 = host;
                    test2.TryGetValue("network",out var network);
                    Dictionary<string,dynamic> test3 = network;
                    test3.TryGetValue("in",out var input);
                    Dictionary<string,dynamic> test4 = input;
                    test4.TryGetValue("bytes",out var final);
                    test.TryGetValue("@timestamp",out dynamic time);
                    string test145 = time;
                    long test144 = final;
                    Data d = new Data
                    {
                        Bytes = test144,Timestamp = test145
                    };
                    Console.WriteLine(d.Bytes);
                    data.Add(d);
                    Console.WriteLine(data);
                }

我的数据类

public class Data
{
    public string Timestamp { get; set; }

    public long Bytes { get; set; }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。