当前位置: 首页 > 知识库问答 >
问题:

Elasticsearch如何对聚合结果后的值进行求和

华建同
2023-03-14
{
        "_index": "f2016-07-17",
        "_type": "trkvjadsreqpxl.gif",
        "_id": "AVX2N3dl5siG6SyfyIjb",
        "_score": 1,
        "_source": {
          "time": "1468714676424",
          "meta": {
            "cb_id": 25681,
            "mt_id": 649,
            "c_id": 1592,
            "revenue": 2.5,
            "mt_name": "GMS-INAPP-EN-2.5",
            "c_description": "COULL-INAPP-EN-2.5",
            "domain": "wv.inner-active.mobi",
            "master_domain": "649###wv.inner-active.mobi",
            "child_domain": "1592###wv.inner-active.mobi",
            "combo_domain": "25681###wv.inner-active.mobi",
            "ip": "52.42.87.73"
          }
        }
      }

我想在多个字段上进行日期直方图/范围聚合,并将结果存储在其他集合/索引中。因此,我可以在小时范围内使用查询/聚合使doc_count和。

聚合如下:

{
  "aggs": {
    "hour":{
      "date_histogram": {
        "field": "time",
        "interval": "hour"
      },
      "aggs":{
            "hourly_M_TAG":{
               "terms":{
                  "field":"meta.mt_id"
               }
            }
         }....
    }
  }
} 

结果不出所料:

"aggregations": {
    "hour": {
      "buckets": [
        {
          "key_as_string": "2016-07-17T00:00:00.000Z",
          "key": 1468713600000,
          "doc_count": 94411750,
          "hourly_M_TAG": {
            "doc_count_error_upper_bound": 1485,
            "sum_other_doc_count": 30731646,
            "buckets": [
              {
                "key": 10,
                "doc_count": 10175501
              },
              {
                "key": 649,
                "doc_count": 200000
              }....
            ]
          }
        },
        {
          "key_as_string": "2016-07-17T01:00:00.000Z",
          "key": 1468717200000,
          "doc_count": 68738743,
          "hourly_M_TAG": {
            "doc_count_error_upper_bound": 2115,
            "sum_other_doc_count": 22478590,
            "buckets": [
              {
                "key": 559,
                "doc_count": 8307018
              },
              {
                "key": 649,
                "doc_count" :100000
              }...

假设我解析了响应,并尝试将结果存储在其他索引/集合中。

存储聚合结果的最佳方式是什么,这样我就可以进行其他查询/聚合,以求和不同小时范围之间的“doc_count”?

例如:在“2016-07-17t00:00.000z”-“2016-07-17t01:00:00.000z”之间,希望查看每个键的总doc_count

预期结果:

{
          "range_sum": {
            "buckets": [
              {
                "key": 649,
                "doc_count": 300000 // (200000+100000)
              },
              {
                "key": 588,
                "doc_count": 2928548 // ... + ...
              }....
            ]
          }
        }

谢了!

共有1个答案

骆雅昶
2023-03-14

我可能搞错了您的最终目标,但在我看来,您希望在可配置的时间范围内,为meta.mt_id的每个值获得doc_count的总的doc_count

如果是这种情况,我不认为您真的需要存储第一次聚合的结果,您真的只需要更改间隔值来反映您想要的桶大小。如果您想要meta.mt_id每个值的总计,那么翻转聚合可能会有所帮助,这样您首先按术语聚合,然后按日期聚合:

{
    "size": 0,
    "aggs": {
    "hourly_M_TAG": {
      "terms": {
        "field": "meta.mt_id"
      },
      "aggs": {
      "hour": {
        "date_histogram": {
          "field": "time",
          "interval": "2h"
        }
      }
    }
  }
}

这将给出每个meta.mt_id的结果,如果您希望为特定的时间范围添加总数,只需更改间隔以反映这一点。

编辑:

可能有一些聪明的elasticsearch方法可以做到这一点,但我想我会这样做:

foreach bucket in buckets:
    index:
        {
            "id" : {meta.id},
            "timestamp" : {key_as_string}
            "count" : {doc_count}
        }
{
  "size": 0,
  "filter": {
    "range": {
      "timestamp": {
        "gte": "now-1h",
        "lte": "now"
      }
    }
  },
  "aggs": {
    "termName": {
      "terms": {
        "field": "id"
      },
      "aggs": {
        "sumCounts": {
          "sum": {
            "field": "count"
          }
        }
      }
    }
  }
}
 类似资料:
  • 问题内容: 根据上述问题,我用Val给定的脚本进行的elasticsearch查询在最后一周之前都可以正常工作。我们已经升级了ES版本,但突然停止了工作。 现在突然我的ES停止使用脚本中包含“ as Integer”的代码。任何人都可以检查和帮助。 我尝试了给定的查询,现在它抛出以下异常。 我作为参数传递的查询是: 由于我的索引器在该字段中包含1、2、4、6、14个值。但是执行完此查询后,我只得到

  • 问题内容: 想象一下,我有两种记录:一个存储桶和一个项目,其中存储在存储桶中的项目,而存储桶中的项目可能相对较少(通常不超过4个,从不超过10个)。这些记录被压缩为一个(具有更多存储桶信息的项目),并放置在Elasticsearch中。我要解决的任务是通过依赖项属性的过滤查询一次找到500个存储桶(最大),其中包含所有相关项,而我受困于限制/抵消聚合。我该如何执行此类任务?我看到聚合使我可以控制相

  • 我的MongoDB数据库有一个结构 每个a文档都有一个带有bool值vield“result”。我进行聚合选择: 并得到一个结果: 如何计算字段“result”中值“true”和“false”的数量,并得到如下结果:

  • 问题内容: 我想按地址分组,然后按日期获取最新地址,然后按状态过滤此结果。 我在elasticsearch中有此查询,但它最多只能按地址分组并获取最新日期。我无法按状态过滤此结果。 我想使用Elasticsearch从该结果中获得出售状态 问题答案: 使用ES 使用ES可以做到这一点。首先,我们需要汇总地址。然后,我们使用两种汇总,一种汇总获取最新日期,另一种汇总获取销售状态的最新日期。然后,我们

  • 我已经在按\u score desc排序的查询部分中获得了所需的查询结果。现在我需要提取每个文档的3个字段。我想实现如下目标: 我刚刚试过: 1)使用折叠删除重复的值 但问题是它只会保留filed1的不同值,而忽略field 2和field 3的值。例如,我们有2条记录,如下所示: 使用此方法,我们只能获得一条记录,因为它们具有相同的field1值。我想要这三个字段的不同组合值。我们可以使用int

  • 我使用聚合从嵌套字段收集数据并卡住了一点 文件示例: ES允许通过rectangle.attributes._id来分组数据,但是有没有办法让一些“其他”桶把没有添加到任何组中的文档放在那里?或者,也许有一种方法可以通过创建查询来为文档创建桶。我认为桶将是完美的,因为我需要使用“其他”文档进行进一步的聚合。或者也许有一些很酷的解决方法 我使用这样的查询进行聚合 然后得到这个结果 这样的结果将是完美