elasticsearch - 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
我的理解是我们可以分两步完成
- 提取唯一的登录和注销时间
- _count基于过滤器的值(注销时间lte给定时间,登录时间gte给定时间)
我想知道是否可以在单个查询中提取结果?
我正在使用 7.9 版。
解决方案
您可以通过使用 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
}
]
}
}
}
推荐阅读
- javascript - javascript中的结构类型检查
- r - 更改 R RStudio 版本的命令正在运行 Mac Mojave
- python - 如何在 Python 中获取当前位置的日期和时间
- r - dplyr 进入 data.table:过滤 > 分组 > 计数
- django - 如果 url 不是唯一的,我应该定义 get_absolute_url() 吗?
- python - 用于 Smartsheet 的 Python - 获取 _ipython_canary_method_should_not_exist_
- python - 如何基于另一个 numpy 2darray 的 argmin 创建 numpy boolean 2darray?
- python - 如何创建具有多个目标的 TensorSliceDataset?
- protocol-buffers - 有没有办法以编程方式转储 Google 协议缓冲区数据包?
- google-sheets - 使用 ImageSearch 控制 Google 表格的菜单