在Elasticsearch中每分钟存储桶获得唯一计数

时间:2019-12-03 12:45:43

标签: elasticsearch elasticsearch-aggregation

我有以下情况,其中我每60秒内每30秒收到最多50k用户的日志。我正在使用Elasticsearch以以下格式存储数据。

[
  {
    "viewlogId": "9abb5a3a-3678-4459-a425-ccb6f957e317",
    "creationTime": 1575187230000,
    "userId": "USERID_0",
    "viewingSessionId": "2991fa12_viewingSessionId_0_1"
  },
  {
    "viewlogId": "9abb5a3a-3678-4459-a425-ccb6f957e318",
    "creationTime": 1575187230000,
    "userId": "USERID_0",
    "viewingSessionId": "2991fa12_viewingSessionId_0_1"
  },
  {
    "viewlogId": "9abb5a3a-3678-4459-a425-ccb6f957e319",
    "creationTime": 1575187230000,
    "userId": "USERID_0",
    "viewingSessionId": "2991fa12_viewingSessionId_0_1"
  },
  {
    "viewlogId": "9abb5a3a-3678-4459-a425-ccb6f957e320",
    "creationTime": 1575187290000,
    "userId": "USERID_0",
    "viewingSessionId": "2991fa12_viewingSessionId_0_1"
  },
  {
    "viewlogId": "9abb5a3a-3678-4459-a425-ccb6f957e321",
    "creationTime": 1575187290000,
    "userId": "USERID_0",
    "viewingSessionId": "2991fa12_viewingSessionId_0_1"
  }
]

此示例包含与viewingSessionId 2991fa12_viewingSessionId_0_1进行一次会话的单个用户的数据。 viewingSessionId 对于每个用户而言都是唯一的。

现在,我有兴趣显示具有唯一的viewsessionIds的每分钟直方图。为此,我正在使用以下查询。

GET <<index_name>>/_search
{
  "size": 0,
  "query": {
    "bool": {
      "adjust_pure_negative": true,
      "boost": 1
    }
  },
  "aggregations": {
    "total_views": {
      "cardinality": {
        "field": "viewingSessionId"
      }
    },
    "date_histogram_1": {
      "date_histogram": {
        "field": "creationTime",
        "fixed_interval": "1m"
      },
      "aggregations": {
        "user_counts": {
          "cardinality": {
            "field": "viewingSessionId"
          }
        }
      }
    }
  }
}

但是根据弹性文档here,我在测试过程中也观察到基数计数是近似的,阈值为40k。由于我每分钟有5万个用户和1-2个查看日志,所以在一个存储桶中,我最多可以有15万条记录,而计数将是近似值。

其他任何通过更改索引结构或通过查询来解决问题的方法

谢谢

  

ElasticSearch版本:7.4.1

0 个答案:

没有答案