当前位置: 首页 > 面试题库 >

计算data_histogram聚合中的差异

寿鸣
2023-03-14
问题内容

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

  • 自上周以来增加了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集合之外的字段。在Elasticsearch中是否可能,可能是通过 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-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因为那一周之前我还没有创建任何文档。

希望能帮助到你!



 类似资料:
  • 本文向大家介绍MongoDB 中聚合统计计算--$SUM表达式,包括了MongoDB 中聚合统计计算--$SUM表达式的使用技巧和注意事项,需要的朋友参考一下 我们一般通过表达式$sum来计算总和。因为MongoDB的文档有数组字段,所以可以简单的将计算总和分成两种: 1,统计符合条件的所有文档的某个字段的总和; 2,统计每个文档的数组字段里面的各个数据值的和。这两种情况都可以通过$sum表达式来

  • 我知道聚合和组合之间的概念差异。有人能用实例告诉我它们之间在Java中的实现区别吗?

  • 问题内容: 我需要计算管道聚合返回的结果集中的存储桶数。问题是我的查询在这里使用脚本选择器: 返回类似这样的内容: 在该键下,我可以看到一个满足我条件的访问者列表(由标识的每个访问者都必须在索引中恰好有三个文档),但这不是很有用,因为它可以处理成千上万的访问者。我正在使用PHP处理结果,从理论上讲,它可以计算结果集,但是对于大量的访问者来说,这并不是最好的主意。有没有一种方法可以仅在和旁边输出有效

  • 问题内容: 是否有任何库(第3方或内置库)来计算文本差异? 问题答案: 什么样的差异?文件差异?有array_diff()作用于数组。然后还有xdiff,它“使您能够创建和应用包含文件的不同修订版之间的差异的修补程序文件”。后者作用于文件或字符串。 编辑:我应该添加xdiff似乎尚未发布。您必须从源代码进行构建才能使用它。

  • 我一直在做一项研究,试图了解GIT合并是如何工作的。我知道有几种合并类型,如递归、octopus等。我发现resolve/recursive是最常用的。只有当有几个共同的祖先/基时,递归合并才有用。 但是,我找不到使用哪种算法(或者如何计算祖先),重复地从分支合并到主分支。 一个简单的例子。让我们用1个文件“a”创建一个空项目: 然后创建另一个文件“B”并提交给master 然后,我从只有1个文件

  • 问题内容: 在我的程序开始和结束时, 但是,当我尝试区别时,我会遇到语法错误…。我做错了一些事情,但是我不确定发生了什么… 基本上,我只想在程序开始时将时间存储在变量中,然后将第二次时间存储在末尾的第二个变量中,然后在程序的最后一位中计算差并显示出来。我不是要为功能速度计时。我正在尝试记录用户通过某些菜单花费的时间。做这个的最好方式是什么? 问题答案: 该模块将为您完成所有工作: 如果您不想显示微