使用doc_count作为累积计数

时间:2015-12-23 23:40:25

标签: elasticsearch querydsl

我目前正在尝试根据弹性搜索中收集的数据生成图表。每次生成用户时,我都会在ES中插入一条记录,其中包含以下(示例)数据:

{
  "country": "US",
  "id": "79ca9523dcd62420030de12b75e08bb7",
  "createdAt": "1450912898"
}

ID是用户ID的哈希值,因此出于隐私原因,无法根据存储在ES中的ID确定用户ID。

ES索引中的类型映射如下:

{
  "user": {
    "_timestamp": {
      "enabled": true
    },
    "properties": {
      "country": {
        "type": "string"
      },
      "createdAt": {
        "type": "date",
        "format": "epoch_second"
      },
      "id": {
        "type": "string",
        "index": "not_analyzed"
      }
    }
  }
}

现在,要获取每天用户的图表,我有以下查询:

{
  "size": 0,
  "query": {
    "type": {
      "value": "user"
    }
  },
  "aggs": {
    "users_per_day": {
      "date_histogram": {
        "field": "createdAt",
        "interval": "day"
      }
    }
  }
}

这给了我一个很好的结果,比如这个(结果我把时间间隔设置为分钟,让你稍微了解问题所在):

[{
  "key_as_string": "1450909920",
  "key": 1450909920000,
  "doc_count": 8
},
{
  "key_as_string": "1450909980",
  "key": 1450909980000,
  "doc_count": 2
},
{
  "key_as_string": "1450910040",
  "key": 1450910040000,
  "doc_count": 5
},
{
  "key_as_string": "1450910100",
  "key": 1450910100000,
  "doc_count": 8
},
{
  "key_as_string": "1450910160",
  "key": 1450910160000,
  "doc_count": 4
},
{
  "key_as_string": "1450910220",
  "key": 1450910220000,
  "doc_count": 3
},
{
  "key_as_string": "1450910280",
  "key": 1450910280000,
  "doc_count": 6
}]

我想使用doc_count生成累积图表,这样我就可以看到用户群的增长,而不是每天的帐户数量。尽管在互联网上搜索,我找不到一个似乎与我的问题有关的答案。我找到的大多数答案都指示我进入Cumulative Sum Aggregation页面,但是那里给出的示例将为您提供在单个存储桶中捕获的所有结果的累积总和。我想要所有桶总数的累积总和。

1 个答案:

答案 0 :(得分:6)

您使用cumulative sum aggregation走在正确的道路上,您绝对可以使用它。你只需要使用特殊的_count bucket path,这将完成你期望的工作。

{
  "size": 0,
  "query": {
    "type": {
      "value": "user"
    }
  },
  "aggs": {
    "users_per_day": {
      "date_histogram": {
        "field": "createdAt",
        "interval": "day"
      },
      "aggs": {
        "cumulative": {
          "cumulative_sum": {
            "buckets_path": "_count"
          }
        }
      }
    }
  }
}

结果如下:

[{
  "key_as_string": "1450909920",
  "key": 1450909920000,
  "doc_count": 8,
  "cumulative": {"value": 8}
},
{
  "key_as_string": "1450909980",
  "key": 1450909980000,
  "doc_count": 2,
  "cumulative": {"value": 10}
},
{
  "key_as_string": "1450910040",
  "key": 1450910040000,
  "doc_count": 5,
  "cumulative": {"value": 15}
},
{
  "key_as_string": "1450910100",
  "key": 1450910100000,
  "doc_count": 8,
  "cumulative": {"value": 23}
},
{
  "key_as_string": "1450910160",
  "key": 1450910160000,
  "doc_count": 4,
  "cumulative": {"value": 27}
},
{
  "key_as_string": "1450910220",
  "key": 1450910220000,
  "doc_count": 3,
  "cumulative": {"value": 30}
},
{
  "key_as_string": "1450910280",
  "key": 1450910280000,
  "doc_count": 6,
  "cumulative": {"value": 36}
}]