首页 > 解决方案 > Elasticsearch:根据折叠值获取总数

问题描述

我是 Elasticsearch 的新手,我正在尝试提取给定时间段内活跃的并发用户总数。

例如,我有一个数据集如下:

用户登录时间注销时间

2020-09-21T10:00:00 2020-09-21T10:30:00

B 2020-09-21T10:00:10 2020-09-21T10:30:15

C 2020-09-21T10:00:08 2020-09-21T10:30:10

D 2020-09-21T10:00:15 2020-09-21T10:30:03

根据上述数据,我想构建以下结果:

时间戳并发用户

2020-09-21T10:00:00 1

2020-09-21T10:00:08 2

2020-09-21T10:00:10 3

2020-09-21T10:00:15 4

2020-09-21T10:30:00 4

2020-09-21T10:30:03 3

2020-09-21T10:30:10 2

2020-09-21T10:30:15 1

我的理解是我们可以分两步完成

  1. 提取唯一的登录和注销时间
  2. _count基于过滤器的值(注销时间lte给定时间,登录时间gte给定时间)

我想知道是否可以在单个查询中提取结果?

我正在使用 7.9 版。

标签: elasticsearch

解决方案


您可以通过使用 gte 将新字段“会话”设置为 date_range 来做到这一点:logintime et lte: logouttime

然后你就可以做一个 date_histogramm。

请在下面找到一个小测试用例:

PUT test/_mapping
{
    "properties": {
      "date_range_test": {
        "type": "date_range"
      }
    }
 
}

POST test/_doc
{
  "title": "test1",
  "date_range_test": {
    "gte": "2020-01-01",
    "lte": "2020-01-05"
  }
}

POST test/_doc
{
  "title": "test1",
  "date_range_test": {
    "gte": "2020-01-02",
    "lte": "2020-01-05"
  }
}

POST test/_doc
{
  "title": "test2",
  "date_range_test": {
    "gte": "2020-01-02",
    "lte": "2020-01-07"
  }
}


POST test/_doc
{
  "title": "test3",
  "date_range_test": {
    "gte": "2020-01-07",
    "lte": "2020-01-08"
  }
}

GET test/_search
{
  "size": 0,
  "aggs": {
    "sessions": {
      "date_histogram": {
        "field": "date_range_test",
        "fixed_interval": "1d"
      }
    }
  }
}

和回应

{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 5,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "sessions" : {
      "buckets" : [
        {
          "key_as_string" : "2020-01-01T00:00:00.000Z",
          "key" : 1577836800000,
          "doc_count" : 1
        },
        {
          "key_as_string" : "2020-01-02T00:00:00.000Z",
          "key" : 1577923200000,
          "doc_count" : 3
        },
        {
          "key_as_string" : "2020-01-03T00:00:00.000Z",
          "key" : 1578009600000,
          "doc_count" : 3
        },
        {
          "key_as_string" : "2020-01-04T00:00:00.000Z",
          "key" : 1578096000000,
          "doc_count" : 3
        },
        {
          "key_as_string" : "2020-01-05T00:00:00.000Z",
          "key" : 1578182400000,
          "doc_count" : 3
        },
        {
          "key_as_string" : "2020-01-06T00:00:00.000Z",
          "key" : 1578268800000,
          "doc_count" : 1
        },
        {
          "key_as_string" : "2020-01-07T00:00:00.000Z",
          "key" : 1578355200000,
          "doc_count" : 2
        },
        {
          "key_as_string" : "2020-01-08T00:00:00.000Z",
          "key" : 1578441600000,
          "doc_count" : 1
        }
      ]
    }
  }
}

推荐阅读