有一组我想要分析的客户。我对客户增长感兴趣,例如:
自上周以来
该怎么做:
因此,首先我将创建一个柱状图,按周对客户进行存储:
{
"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集合外部的一个字段。在elasticsearch中,可能是通过Bucket脚本聚合吗
另一个想法是做一些优化,只为有限数量的客户创建直方图。我试过了:
{
"query":{
"range":{
"created":{
"gte":"now-1w",
"lte":"now"
}
}
}
}
然而,这没有考虑整个上周,而只考虑了最近7天,这与上周的情况不同。有没有办法在本周和上周创建客户?
发布于 2018-10-22 01:45:51
嗯,我已经试过了,我希望它会有用。我已经利用了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
,因为在那周之前我还没有创建任何文档。
希望它能帮上忙!
https://stackoverflow.com/questions/52890807
复制相似问题