我想分析一组客户。我对客户增长感兴趣,例如:
做什么:
因此,首先,我将创建一个直方图,按周对客户进行分类:
{
"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天,这与上周不同。有没有办法让客户在本周和上周创建?
答案 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
,因为那一周之前我还没有创建任何文档。
希望有帮助!