计算data_histogram聚合中的差异

时间:2018-10-19 10:45:25

标签: elasticsearch

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

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

做什么:

  • 获取本周在哪里创建的客户
  • 获取上周创建的客户
  • 算出他们
  • 计算差异(百分比)

因此,首先,我将创建一个直方图,按周对客户进行分类:

{  
  "aggs":{  
    "customers_over_time":{  
      "date_histogram":{  
        "field":"created",
        "interval":"week"
      }
    }
  }
}

例如结果

{  
  "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集合之外的字段。可以通过 Bucket脚本聚合 在Elasticsearch中实现吗?

另一种想法是进行一些优化,并仅为有限数量的客户创建直方图。我尝试过:

{  
  "query":{  
    "range":{  
      "created":{  
        "gte":"now-1w",
        "lte":"now"
      }
    }
  }
}

但是,这并不考虑整个上周,而仅考虑了过去7天,这与上周不同。有没有办法让客户在本周和上周创建?

1 个答案:

答案 0 :(得分:0)

好吧,我尝试了一些东西,希望对您有所帮助。我已经使用了Elasticsearch序列差异汇总功能,您可以参考此LINK以获得更多详细信息。

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

在一周2018-10-15中创建的用户的差异为2

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

查询

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,因为在这种情况下,您只需要连续两个星期或每个时段之间的差额即可。

查询结果:

{
  "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,因为那一周之前我还没有创建任何文档。

希望有帮助!