我有文件,看起来类似于以下内容:
{
dateTime: /* My time field */,
message: {
users: ['1', '2']
},
messageType: 'test'
}
我想构建一个 timelion 系列图表,向我显示数组
message.users
计数的累积总和。我的第一个想法是创建一个脚本:if(doc.containsKey('message.users')) {
return doc['message.users'].length;
} else {
return 0;
}
据我所知,
doc.containsKey('message.users')
总是错误的,这告诉我它可能没有正确索引。我已经尝试了很多 Timelion,都无济于事:.es(index=logstash-*,timefield='dateTime',q='messageType:UserList').label('Users Online')
我通过 c# NEST api 索引我的文档,如下所示:
elasticClient.Index(
new
{
DateTime = DateTime.Now,
Message = evt.EventArgs.Message,
},
idx => idx.Index($"logstash-{evt.MessageCode}"));
最佳答案
我建议在您的文档中添加另一个名为 userCount
的字段,这样您就不需要搞乱脚本(+ 它会更高效)。
所以你的文件应该是这样的:
{
dateTime: /* My time field */,
message: {
users: ['1', '2']
},
userCount: 2, <--- add this field
messageType: 'test'
}
解决方案1:
您需要将代码稍微更改为:
elasticClient.Index(
new
{
DateTime = DateTime.Now,
Message = evt.EventArgs.Message,
UserCount = evt.EventArgs.Message.Users.Length
},
idx => idx.Index($"logstash-{evt.MessageCode}"));
解决方案2:
如果您使用的是 ES 5,您可以利用 Ingest API 来创建一个管道,该管道将自动为您添加该
userCount
字段。您不必更改代码中的任何内容。PUT _ingest/pipeline/user-count-pipeline
{
"description" : "Creates a new userCount field",
"processors" : [
{
"script": {
"lang": "painless",
"inline": "ctx.userCount = ctx.message?.users?.size() ?: 0"
}
}
]
}
然后,在 Timelion 中,使用
metric='sum:userCount'
对 userCount
值求和并使用 cusum()
函数来获取 userCount
随时间的累积总和,将很容易绘制出您需要的图表。整个表达式如下所示:.es(index=logstash-*,timefield='dateTime',q='messageType:UserList',metric='sum:userCount').label('Users Online').cusum()
使用一些示例文档,时间序列看起来像这样,这似乎是您要查找的内容。
关于elasticsearch - 来自数组长度累积和的 Timelion 系列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45293427/