根据最高序列号计算从Elasticsearch日志传输的总字节数

时间:2017-05-31 21:37:57

标签: elasticsearch

使用弹性搜索5.文档是数据传输日志(数百万),包含以下相关字段:

  • 会话,号码(每个会话唯一)
  • 序列,数字(序号,每个数据包,从会话的第1个到最后一个数据包的范围,值从0到100000000 ....)
  • 字节数,数字,总传输数(字节数,按序列增长,是到目前为止在会话中传输的总字节数)

查询的理想结果:

  • 唯一会话总数(已解决此问题)

  • 传输的字节总数 - 这是我失败的地方。对于给定的唯一会话号,必须选择序列号最大的文档,并将传输的字节数添加到汇总金额中。

示例文件:

{"session":1,"sequence":0,"bytes":512}
{"session":2,"sequence":0,"bytes":323}
{"session":1,"sequence":1,"bytes":1287}
{"session":1,"sequence":2,"bytes":3456}
{"session":2,"sequence":1,"bytes":800}
{"session":3,"sequence":0,"bytes":200}
{"session":1,"sequence":3,"bytes":4000}

期望的示例结果:

  • 会话总数:3(独特'会话'值的总和 - 会话1,2,3)
  • 字节总数:5000('字节的总和'来自每个唯一会话的最后/最大序列号)

我可以通过类似的查询获得会话总数:

GET /index/type/_search
{
 "size":0,
 "query" : {
    ... my query details
 },
 "aggs" : {
  "distinct_sessions" : {
   "cardinality" : {
    "field" : "session"
   }
  }
 }
}

我无法弄清楚如何从这些独特的会话中获得总和,特别是只需要获得最高序列号的要求。我尝试过使用top_hits,大小为1,降序的变体,但我无法正确使用。

其他人试图做类似的事情吗?

1 个答案:

答案 0 :(得分:0)

您在会话中使用terms聚合的方法是正确的方向。此查询应该为您提供所需内容:

{
  "size": 0,
  "aggs": {
    "sessions": {
      "terms": {
        "field": "session"
      },
      "aggs": {
        "top_hits": {
          "size": 1,
          "sort": {
            "sequence": "desc"
          },
          "_source": [
            "bytes"
          ]
        }
      }
    }
  }
}

否则,如果您不需要保留所有会话历史记录,则只需使用会话ID作为文档ID,这样您就可以在文档中使用最新的会话数据问题解决了这个问题。