首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >计算data_histogram聚合中的差异

计算data_histogram聚合中的差异
EN

Stack Overflow用户
提问于 2018-10-19 18:45:25
回答 1查看 444关注 0票数 0

有一组我想要分析的客户。我对客户增长感兴趣,例如:

自上周以来

  • +43 (+32%)新客户
  • 自去年以来+12650 (+1140%)新客户

该怎么做:

  • 获取本周创建的客户
  • 获取上周创建的客户
  • count them
  • compute difference (in percentage)

因此,首先我将创建一个柱状图,按周对客户进行存储:

代码语言:javascript
复制
{  
  "aggs":{  
    "customers_over_time":{  
      "date_histogram":{  
        "field":"created",
        "interval":"week"
      }
    }
  }
}

例如,这会导致

代码语言:javascript
复制
{  
  "buckets":[  
    ...,
    {  
      "key_as_string":"2018-10-01T00:00:00.000Z",
      "key":1538352000000,
      "doc_count":1
    },
    {  
      "key_as_string":"2018-10-08T00:00:00.000Z",
      "key":1538956800000,
      "doc_count":7
    },
    {  
      "key_as_string":"2018-10-15T00:00:00.000Z",
      "key":1539561600000,
      "doc_count":5
    }
  ]
}

然后,我只需获取最后两个条目并计算差值,然后将其分配给buckets集合外部的一个字段。在elasticsearch中,可能是通过Bucket脚本聚合吗

另一个想法是做一些优化,只为有限数量的客户创建直方图。我试过了:

代码语言:javascript
复制
{  
  "query":{  
    "range":{  
      "created":{  
        "gte":"now-1w",
        "lte":"now"
      }
    }
  }
}

然而,这没有考虑整个上周,而只考虑了最近7天,这与上周的情况不同。有没有办法在本周和上周创建客户?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-22 01:45:51

嗯,我已经试过了,我希望它会有用。我已经利用了Elasticsearch串行差异聚合特性,您可以参考此LINK了解更多详细信息。

假设我有本周的three文档,即week starting from 2018-10-15,仅有上周的one文档,即week starting from 2018-10-08

在一周内创建的用户的差值2018-10-152

下面是我提出的示例查询,它将向您显示与前一周计数的差异。

查询

代码语言:javascript
复制
POST testdateindex/_search
{
  "size" : 0,
  "query" : {
    "bool" : {
      "must" : {
        "range" : {
          "created" : {
            "from":"now-2w",
            "to":"now",
            "include_lower" : true,
            "include_upper" : true
          }
        }
      }
    }
  },
  "aggs": {
    "customers_over_time": {
      "date_histogram": {
        "field": "created",
        "interval": "week"
      },
      "aggs": {
            "difference": {
               "serial_diff": {                
                  "buckets_path": "_count",
                  "lag" : 1
               }
            }
         }
    }
  }
}

我使用lag作为1,因为在这种情况下,您只需要连续两周或存储桶之间的差异。

查询结果:

代码语言:javascript
复制
{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 4,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "customers_over_time": {
      "buckets": [
        {
          "key_as_string": "2018-10-08T00:00:00.000Z",
          "key": 1538956800000,
          "doc_count": 1
        },
        {
          "key_as_string": "2018-10-15T00:00:00.000Z",
          "key": 1539561600000,
          "doc_count": 3,
          "difference": {
            "value": 2
          }
        }
      ]
    }
  }
}

结果将显示该周所有文档的计数,以及上述json中的difference部件,该部件将保存计数与上周计数的差值。

注意,第一个存储桶没有difference,因为在那周之前我还没有创建任何文档。

希望它能帮上忙!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52890807

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档