首页 > 解决方案 > 计算 data_histogram 聚合中的差异

问题描述

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

该怎么办:

所以首先我会创建一个直方图来按周存储客户:

{  
  "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 Script Aggregation

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

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

但是,这并没有考虑到整个上周,而只是考虑了最后 7 天,这与上周不同。有没有办法让本周和上周创建客户?

标签: elasticsearch

解决方案


好吧,我尝试了一些东西,希望它有用。我已经使用了 的序列差异聚合功能,Elasticsearch您可以参考此链接了解更多详细信息。

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

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

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

询问

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
               }
            }
         }
    }
  }
}

在这种情况下,我已经使用了lagas 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
          }
        }
      ]
    }
  }
}

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

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

希望能帮助到你!


推荐阅读