elasticsearch - 计算 data_histogram 聚合中的差异
问题描述
我想分析一组客户。我对客户增长感兴趣,例如:
- 自上周以来增加了 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 Script Aggregation?
另一个想法是进行一些优化并仅为有限数量的客户创建直方图。我试过:
{
"query":{
"range":{
"created":{
"gte":"now-1w",
"lte":"now"
}
}
}
}
但是,这并没有考虑到整个上周,而只是考虑了最后 7 天,这与上周不同。有没有办法让本周和上周创建客户?
解决方案
好吧,我尝试了一些东西,希望它有用。我已经使用了 的序列差异聚合功能,Elasticsearch
您可以参考此链接了解更多详细信息。
假设我有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
as 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
因为在那周之前我没有创建任何文档。
希望能帮助到你!
推荐阅读
- keras - Keras:多类 CNN 文本分类器为所有输入数据预测相同的类
- java - 使用带有 java (+ lombok) 的不可变类的 spark 中的反序列化错误
- python - 当我从特定网页下载时让 python 知道
- swift - 替换 NSAttributedString 中的图像
- azure-cosmosdb - 如何从 CosmosDB 文档中的特定位置检索数组元素?
- javascript - 如何将 jQuery 代码集成到 Angular 8 中?
- php - 在functions.php中返回带有令牌授权的API响应
- sql - 在变量中使用带有多个单词的 SQL CONTAINS
- reactjs - 用玩笑和酶测试蚂蚁设计形式
- php - 未找到 PDO SQL 删除语句