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

嵌套聚合ElasticSearch的问题:在最大值之后求和

羊昊苍
2023-03-14

我知道使用度量聚合不可能实现子聚合,Elasticsearch支持使用桶的子聚合。但我对如何做到这一点有点迷茫。

我想在嵌套聚合和按最大时间戳聚合之后进行求和。

类似于下面的代码,给我这个错误:“[max]类型的聚合器[max\u date\u aggs]不能接受子聚合”,这是正常的。有没有办法让它发挥作用?

{
"aggs": {
    "sender_comp_aggs": {
        "terms": {
            "field": "senderComponent"
        },
        "aggs": {
            "activity_mnemo_aggs": {
                "terms": {
                    "field": "activityMnemo"
                },
                "aggs": {
                    "activity_instance_id_aggs": {
                        "terms": {
                            "field": "activityInstanceId"
                        },
                        "aggs": {
                            "business_date_aggs": {
                                "terms": {
                                    "field": "correlationIdSet.businessDate"
                                },
                                "aggs": {
                                    "context_set_id_closing_aggs": {
                                        "terms": {
                                            "field": "contextSetId.closing"
                                        },
                                        "aggs": {
                                            "max_date_aggs": {
                                                "max": {
                                                    "field": "timestamp"
                                                },
                                                "aggs" : {
                                                    "sum_done": {
                                                        "sum": {
                                                            "field": "itemNumberDone"
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }

非常感谢。

共有2个答案

柯翔
2023-03-14

这里有两个文件:

{
        "_type": "gos_element",
        "_id": "AW_yu3dIa2R_HwqpSz-o",
        "_score": 5.785128,
        "_source": {
          "senderComponent": "PS",
          "timestamp": "2020-01-28T02:31:00Z",
          "activityMnemo": "PScommand",
          "activityInstanceId": "123466",
          "activityStatus": "Progress",
          "activityStatusNumber": 300,
          "specificActivityStatus": "",
          "itemNumberTotal": 10,
          "itemNumberDone": 9,
          "itemNumberInError": 0,
          "itemNumberNotStarted": 1,
          "itemNumberInProgress": 0,
          "itemUnit": "Command",
          "itemList": [],
          "contextSetId": {
            "PV": "VAR",
            "closing": "PARIS"
          },
          "correlationIdSet": {
            "closing": "PARIS",
            "businessDate": "2020-01-27",
            "correlationId": "54947df8-0e9e-4471-a2f9-9af509fb5899"
          },
          "errorSet": [],
          "kpiSet": "",
          "activitySpecificPayload": "",
          "messageGroupUUID": "54947df8-0e9e-4471-a2f9-9af509fb5899"
        }
      },
      {
        "_type": "gos_element",
        "_id": "AW_yu3dIa2R_HwqpSz8z",
        "_score": 4.8696175,
        "_source": {
          "senderComponent": "PS",
          "timestamp": "2020-01-28T03:01:00Z",
          "activityMnemo": "PScommand",
          "activityInstanceId": "123466",
          "activityStatus": "End",
          "activityStatusNumber": 200,
          "specificActivityStatus": "",
          "itemNumberTotal": 10,
          "itemNumberDone": 10,
          "itemNumberInError": 0,
          "itemNumberNotStarted": 0,
          "itemNumberInProgress": 0,
          "itemUnit": "Command",
          "itemList": [],
          "contextSetId": {
            "PV": "VAR",
            "closing": "PARIS"
          },
          "correlationIdSet": {
            "closing": "PARIS",
            "businessDate": "2020-01-27",
            "correlationId": "54947df8-0e9e-4471-a2f9-9af509fb5899"
          },
          "errorSet": [],
          "errorMessages": "",
          "kpiSet": "",
          "activitySpecificPayload": "",
          "messageGroupUUID": "54947df8-0e9e-4471-a2f9-9af509fb5899"
        }
      }
    ]
  }

我想聚合几个术语(senderComponent、actiityMnemo、actiityInstanceId、corAssociIdSet.businessDate和contextSetId.closing),并聚合每个聚合的最大时间戳。一旦完成,我想将itemNumberDone求和。

如果我们只取这两个文档并进行聚合,我想得到10个itemNumberDone。

只有一个查询并使用桶是否可能?

符允晨
2023-03-14

我不是100%确定你想要实现什么,如果你也会共享映射,它会有所帮助。

bucket聚合是关于定义bucket/Group的。正如您在示例中所做的那样,您可以包装/嵌套桶聚合,以进一步将桶分解为子桶,以此类推。

默认情况下,Elasticsearch始终计算计数指标,但您也可以指定其他指标进行计算。度量是按每个bucket/为一个bucket(而不是另一个度量)计算的。这就是为什么不能在度量聚合下嵌套度量聚合,这根本没有意义。

根据您的数据看起来如何,您可能需要做的唯一更改是将sum_done聚合移出aggs-子句,移动到与您的相同的级别max_date_aggs-聚合。

代码段

"aggs": {
  "max_date_aggs": { "max": {"field": "timestamp"} },
  "sum_done": { "sum": { "field": "itemNumberDone"} }
}

在您完善了您的问题并提供了解决方案后,我设法想出了一个只需一个请求的解决方案。如前所述,sum-度量聚合需要对bucket而不是度量进行操作。解决方案非常简单:与其计算最大日期,不如将此聚合重新表述为术语聚合,按降序时间戳排序,只要求一个bucket。

解决方案

GET gos_element/_search
{
  "size": 0, 
  "aggs": {
    "sender_comp_aggs": {
      "terms": {"field": "senderComponent.keyword"},
      "aggs": {
        "activity_mnemo_aggs": {
          "terms": {"field": "activityMnemo.keyword"},
          "aggs": {
            "activity_instance_id_aggs": {
              "terms": {"field": "activityInstanceId.keyword"},
              "aggs": {
                "business_date_aggs": {
                  "terms": {"field": "correlationIdSet.businessDate"},
                  "aggs": {
                    "context_set_id_closing_aggs": {
                      "terms": {"field": "contextSetId.closing.keyword"},
                      "aggs": {
                        "max_date_bucket_aggs": {
                          "terms": {
                            "field": "timestamp",
                            "size": 1, 
                            "order": {"_key": "desc"} 
                          },
                          "aggs": {
                            "sum_done": {
                              "sum": {"field": "itemNumberDone"}
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

由于我依赖于默认的Elasticsearch映射,所以我必须参考。关键字-字段的版本。如果字段直接映射到类型为“关键字”(keyword)的字段,则不需要这样做。

使用以下2个命令索引您提供的文档后,您可以立即测试上面的请求:

PUT gos_element/_doc/AW_yu3dIa2R_HwqpSz
{
  "senderComponent": "PS",
  "timestamp": "2020-01-28T02:31:00Z",
  "activityMnemo": "PScommand",
  "activityInstanceId": "123466",
  "activityStatus": "Progress",
  "activityStatusNumber": 300,
  "specificActivityStatus": "",
  "itemNumberTotal": 10,
  "itemNumberDone": 9,
  "itemNumberInError": 0,
  "itemNumberNotStarted": 1,
  "itemNumberInProgress": 0,
  "itemUnit": "Command",
  "itemList": [],
  "contextSetId": {
    "PV": "VAR",
    "closing": "PARIS"
  },
  "correlationIdSet": {
    "closing": "PARIS",
    "businessDate": "2020-01-27",
    "correlationId": "54947df8-0e9e-4471-a2f9-9af509fb5899"
  },
  "errorSet": [],
  "kpiSet": "",
  "activitySpecificPayload": "",
  "messageGroupUUID": "54947df8-0e9e-4471-a2f9-9af509fb5899"
}


PUT gos_element/_doc/AW_yu3dIa2R_HwqpSz8z
{
  "senderComponent": "PS",
  "timestamp": "2020-01-28T03:01:00Z",
  "activityMnemo": "PScommand",
  "activityInstanceId": "123466",
  "activityStatus": "End",
  "activityStatusNumber": 200,
  "specificActivityStatus": "",
  "itemNumberTotal": 10,
  "itemNumberDone": 10,
  "itemNumberInError": 0,
  "itemNumberNotStarted": 0,
  "itemNumberInProgress": 0,
  "itemUnit": "Command",
  "itemList": [],
  "contextSetId": {
    "PV": "VAR",
    "closing": "PARIS"
  },
  "correlationIdSet": {
    "closing": "PARIS",
    "businessDate": "2020-01-27",
    "correlationId": "54947df8-0e9e-4471-a2f9-9af509fb5899"
  },
  "errorSet": [],
  "errorMessages": "",
  "kpiSet": "",
  "activitySpecificPayload": "",
  "messageGroupUUID": "54947df8-0e9e-4471-a2f9-9af509fb5899"
}

因此,您将返回以下响应(预期值为10):

{
  "took" : 8,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "sender_comp_aggs" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "PS",
          "doc_count" : 2,
          "activity_mnemo_aggs" : {
            "doc_count_error_upper_bound" : 0,
            "sum_other_doc_count" : 0,
            "buckets" : [
              {
                "key" : "PScommand",
                "doc_count" : 2,
                "activity_instance_id_aggs" : {
                  "doc_count_error_upper_bound" : 0,
                  "sum_other_doc_count" : 0,
                  "buckets" : [
                    {
                      "key" : "123466",
                      "doc_count" : 2,
                      "business_date_aggs" : {
                        "doc_count_error_upper_bound" : 0,
                        "sum_other_doc_count" : 0,
                        "buckets" : [
                          {
                            "key" : 1580083200000,
                            "key_as_string" : "2020-01-27T00:00:00.000Z",
                            "doc_count" : 2,
                            "context_set_id_closing_aggs" : {
                              "doc_count_error_upper_bound" : 0,
                              "sum_other_doc_count" : 0,
                              "buckets" : [
                                {
                                  "key" : "PARIS",
                                  "doc_count" : 2,
                                  "max_date_bucket_aggs" : {
                                    "doc_count_error_upper_bound" : 0,
                                    "sum_other_doc_count" : 1,
                                    "buckets" : [
                                      {
                                        "key" : 1580180460000,
                                        "key_as_string" : "2020-01-28T03:01:00.000Z",
                                        "doc_count" : 1,
                                        "sum_done" : {
                                          "value" : 10.0
                                        }
                                      }
                                    ]
                                  }
                                }
                              ]
                            }
                          }
                        ]
                      }
                    }
                  ]
                }
              }
            ]
          }
        }
      ]
    }
  }
}

 类似资料:
  • 问题内容: 我想获得一个请求数据来构建这样的东西: 首先,我在Elasticsearch上进行映射,如下所示: 然后我添加对象,如下所示。在将许多属性。如果笔记本电脑有许多端口,则每个端口都是中的另一个阵列。 现在我想要这样的结果: 我接近解决问题(我下面的查询),但在第二级聚集我所有的值(例如,在“决议”我有,和)。我想有只,并具有其他关键值,对只,以及其他价值具有关键。 问题答案: 你需要改变

  • 如何聚合一个值在嵌套在Elasticsearch嵌套位置?我对一个嵌套对象没有问题,但在嵌套对象内的嵌套我感到困惑... 样本数据: 欲望结果: 在索引映射中,我将cat_a和条目字段的类型设置为嵌套,当我从工具字段查询聚合时,在cat_a的根(级别1)中没有问题,并且可以工作,但是在聚合中在rx_a(这是在第2级)我不能检索结果,它或空或显示错误,因为我的错误查询。 查询级别1 agg: 如何处

  • 我正在尝试获取日期的最大值和最小值。 从文档中,我看不到composite中的max选项:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-composite-aggregation.html#_value_sources 我想要这样的东西: 是否可以添加到此查询中,

  • 在这里,我得到了错误: “无效的术语聚合顺序路径[price>price>price.max]。术语桶只能在子聚合器路径上排序,该路径由路径中的零个或多个单桶聚合和路径末尾的最终单桶或度量聚合组成。子路径[price]指向非单桶聚合” 如果我按持续时间聚合排序,查询可以正常工作,如 那么,有什么方法可以通过嵌套字段上的嵌套聚合来排序聚合吗?

  • 我试图在c#中运行聚合查询(使用nest 5),但我不知道我得到了多少聚合作为输入以及聚合类型是什么。 例如,一个查询是:{"aggs":{"type_count":{"术语":{"field":"type"}}}} 其他查询将是:{“aggs”:{“type\u count”:{“terms”:{“field”:“type”}},“salary\u count”:{“field”:“salary

  • 我看到一些关于嵌套字段和聚合的帖子,但它们似乎都没有回答我的问题。所以,如果这是一个重复的问题,请原谅,如果有任何帮助,我们将不胜感激。 我们建立了一个讲座索引,讲座具有以下特点: 讲座可以是面对面(现场)或预先录制(在线) 每个讲座可以有多个章节 这些章节中的每一个都可以由不同的讲师讲解(例如:量子物理的第一章可以由五个不同的讲师讲解,其中三个可能是现场直播,另外两个可能在线) 在线讲座每个讲师