问题描述
TLDR:如何获取需要放在 source
中的数据,例如时间戳,而不是一百万个列表和字典?
我正在尝试根据此 nest 查询创建 Data
对象。数据来自 MetricBeats,最终出现在我的 response.hits
中的许多嵌套列表和字典中,如您在 JSON 响应中所见。
我通常会使用这种方法直接映射我的命中:
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 (将#修改为@)