elasticsearch 从数组长度的累积和得到的时间序列
我有一些文件,看起来类似于以下内容:
elasticsearch 从数组长度的累积和得到的时间序列,
elasticsearch,kibana,kibana-5,timelion,
elasticsearch,Kibana,Kibana 5,Timelion,我有一些文件,看起来类似于以下内容: { dateTime: /* My time field */, message: { users: ['1', '2'] }, messageType: 'test' } 我想构建一个timelion系列图表,显示数组message.users的累计计数总和。我的第一个想法是创建一个脚本: if(doc.containsKey('message.users')) { return doc['mess
{
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')
总是错误的,这告诉我它可能没有正确的索引。我尝试过无数次Timelong,但都无济于事:
.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'
}
.es(index=logstash-*,timefield='dateTime',q='messageType:UserList',metric='sum:userCount').label('Users Online').cusum()
解决方案2:
如果您使用的是ES 5,则可以利用来创建管道,该管道将自动为您添加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
的累积和,就很容易绘制出所需的图表。整个表达式如下所示:
{
dateTime: /* My time field */,
message: {
users: ['1', '2']
},
userCount: 2, <--- add this field
messageType: 'test'
}
.es(index=logstash-*,timefield='dateTime',q='messageType:UserList',metric='sum:userCount').label('Users Online').cusum()
使用一些示例文档,时间序列看起来像这样,这似乎就是您要寻找的
你能分享你的
消息的映射吗?用户
字段?另一个好的做法是在索引时创建另一个名为userCount
的字段,其中包含你的消息中的用户数。用户
数组。@Val,很抱歉,elasticsearch是个新手。我刚刚使用了C#Nest API,并更新了我的答案,说明了我是如何为文档编制索引的。是否可以不创建额外的字段UserCount
?如果可以在Kibana中定义一个脚本字段(例如返回参数[''u source'].message.users.size()
),然后在Timelion中使用它,那就太酷了,但不幸的是,如何索引用户数组,并使用函数获取用户数组的大小?如果您使用的是ES 5,我有另一个解决方案。请参阅我的最新答案。