如何解决ElasticSearch - Nest - 映射嵌套在列表和字典中的命中
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 举报,一经查实,本站将立刻删除。