elasticsearch 从数组长度的累积和得到的时间序列,elasticsearch,kibana,kibana-5,timelion,elasticsearch,Kibana,Kibana 5,Timelion" /> elasticsearch 从数组长度的累积和得到的时间序列,elasticsearch,kibana,kibana-5,timelion,elasticsearch,Kibana,Kibana 5,Timelion" />

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,我有另一个解决方案。请参阅我的最新答案。