首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >度量聚合与复合聚合

度量聚合与复合聚合
EN

Stack Overflow用户
提问于 2022-10-28 02:22:01
回答 1查看 66关注 0票数 0

对于索引,我有以下映射:

代码语言:javascript
复制
{
  "test5" : {
    "mappings" : {
      "dynamic" : "false",
      "properties" : {
        "messageType" : {
          "type" : "keyword"
        },
        "groupId" : {
          "type" : "keyword"
        },
        "payload" : {
          "type" : "nested",
          "include_in_root" : true,
          "properties" : {
            "request" : {
              "type" : "nested",
              "include_in_root" : true,
              "properties" : {
                "data" : {
                  "type" : "nested",
                  "include_in_root" : true,
                  "properties" : {
                    "chargingPeriods" : {
                      "type" : "nested",
                      "include_in_root" : true,
                      "properties" : {
                        "endDateTime" : {
                          "type" : "date"
                        },
                        "power" : {
                          "type" : "double"
                        },
                        "startDateTime" : {
                          "type" : "date"
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

第一个用例,我希望基于payload.request.data.chargingPeriods.startDateTimegroupId的桶间隔2分钟,并使用messageType的过滤准则。顺便说一下,chargingPeriods是一个数组。

此查询适用于该用例:

代码语言:javascript
复制
GET test5/_search
{
  "size": 0,
  "aggs": {
    "my_buckets": {
      "composite": {
        "sources": [
          { "sessionId": { "terms": { "field": "groupId"} } },
          {
            "date" : {
              "date_histogram": {
                "field": "payload.request.data.chargingPeriods.startDateTime",
                "fixed_interval": "2m",
                "format": "MM/dd/yyyy - hh:mm:ss",
                "order": "asc"
              }
            }
          }
        ]
      }    
    }
  },
  "query": {
    "terms": {
      "messageType": [
        "test"
      ]
    }
  }
}

现在,我希望在这些复合桶上完成度量聚合,然后我尝试这样做:

代码语言:javascript
复制
GET test5/_search
{
  "size": 0,
  "aggs": {
    "my_buckets": {
      "composite": {
        "sources": [
          { "sessionId": { "terms": { "field": "groupId"} } },
          {
            "date" : {
              "date_histogram": {
                "field": "payload.request.data.chargingPeriods.startDateTime",
                "fixed_interval": "2m",
                "format": "MM/dd/yyyy - hh:mm:ss",
                "order": "asc"
              }
            }
          }
        ]
      },
      "aggregations": {
        "metricAgg": {
          "max": {
            "field": "payload.request.data.chargingPeriods.power"
          }
        }
      }      
    }
  },
  "query": {
    "terms": {
      "messageType": [
        "test"
      ]
    }
  }
}

根据ES文档https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-composite-aggregation.html,这应该通过在组合桶上进行度量聚合来完成,但是不是在组合桶上计算度量聚合,而是在整个给定文档中跨chargingPeriods数组中的所有功率场计算度量聚合。

我是如何创建索引的:

代码语言:javascript
复制
PUT /test5
{
  "settings": {
    "number_of_shards": 1
  },
  "mappings" : {
      "dynamic" : "false",
      "properties" : {
        "groupId" : {
          "type" : "keyword"
        },
        "messageType" : {
          "type" : "keyword"
        },
        "payload" : {
          "type" : "nested",
          "include_in_root": true,
          "properties": {
            "request": {
              "type":"nested",
              "include_in_root":true,
              "properties": {
                "data": {
                  "type":"nested",
                  "include_in_root": true,
                  "properties": {
                    "chargingPeriods": {
                      "type": "nested",
                      "include_in_root": true,
                      "properties" : {
                        "endDateTime":{
                          "type": "date"
                        },
                        "power": {
                          "type": "double"
                        },
                        "startDateTime":{
                          "type": "date"
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
}

测试数据:

代码语言:javascript
复制
    POST test5/_doc/testdocu1
{
  "groupId": "563",
  "messageType": "test",
  "payload": {
    "request": {
      "data": {
        "chargingPeriods": [
          {
            "endDateTime": "2022-10-13T17:42:25Z",
            "power": 9.62857,
            "startDateTime": "2022-10-13T17:41:55Z"
          },
          {
            "endDateTime": "2022-10-13T17:42:55Z",
            "power": 9.6491,
            "startDateTime": "2022-10-13T17:42:25Z"
          },
          {
            "endDateTime": "2022-10-13T17:43:25Z",
            "power": 9.6491,
            "startDateTime": "2022-10-13T17:42:55Z"
          },
          {
            "endDateTime": "2022-10-13T17:43:55Z",
            "power": 9.66963,
            "startDateTime": "2022-10-13T17:43:25Z"
          },
          {
            "endDateTime": "2022-10-13T17:44:25Z",
            "power": 9.67128,
            "startDateTime": "2022-10-13T17:43:55Z"
          },
          {
            "endDateTime": "2022-10-13T17:44:55Z",
            "power": 9.65079,
            "startDateTime": "2022-10-13T17:44:25Z"
          },
          {
            "endDateTime": "2022-10-13T17:45:25Z",
            "power": 9.66492,
            "startDateTime": "2022-10-13T17:44:55Z"
          },
          {
            "endDateTime": "2022-10-13T17:45:55Z",
            "power": 9.68544,
            "startDateTime": "2022-10-13T17:45:25Z"
          },
          {
            "endDateTime": "2022-10-13T17:46:25Z",
            "power": 9.68544,
            "startDateTime": "2022-10-13T17:45:55Z"
          },
          {
            "endDateTime": "2022-10-13T17:46:55Z",
            "power": 9.67434,
            "startDateTime": "2022-10-13T17:46:25Z"
          }
        ]
      }
    }
  }
}

我的产出:

代码语言:javascript
复制
  "aggregations" : {
    "my_buckets" : {
      "after_key" : {
        "sessionId" : "563",
        "date" : "10/13/2022 - 05:46:00"
      },
      "buckets" : [
        {
          "key" : {
            "sessionId" : "563",
            "date" : "10/13/2022 - 05:40:00"
          },
          "doc_count" : 1,
          "metricAgg" : {
            "value" : 9.68544
          }
        },
        {
          "key" : {
            "sessionId" : "563",
            "date" : "10/13/2022 - 05:42:00"
          },
          "doc_count" : 4,
          "metricAgg" : {
            "value" : 9.68544
          }
        },
        {
          "key" : {
            "sessionId" : "563",
            "date" : "10/13/2022 - 05:44:00"
          },
          "doc_count" : 4,
          "metricAgg" : {
            "value" : 9.68544
          }
        },
        {
          "key" : {
            "sessionId" : "563",
            "date" : "10/13/2022 - 05:46:00"
          },
          "doc_count" : 1,
          "metricAgg" : {
            "value" : 9.68544
          }
        }
      ]
    }
  }

如您所见,它从所有元素中选择了最大的payload.request.data.chargingPeriods.power,而忽略了复合桶。例如

代码语言:javascript
复制
{
  "key" : {
    "sessionId" : "563",
    "date" : "10/13/2022 - 05:40:00"
  },
  "doc_count" : 1,
  "metricAgg" : {
    "value" : 9.68544
  }
},

metricAgg应该是9.62857

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-02 08:21:49

它的工作方式不像您所期望的那样,因为您正在聚合您拥有include_in_root的嵌套数据,因此,所有嵌套数据都发现自己位于根文档中,就好像它不是嵌套的,因此,startDateTimepower之间的关系基本上丢失了。

另一个问题是复合聚合聚合嵌套(payload...)和非嵌套数据(groupId),这是行不通的。

但是,如果在数组的每个元素中添加groupId字段,则可以使查询工作如下:

代码语言:javascript
复制
GET test5/_search
{
  "size": 0,
  "aggs": {
    "payload": {
      "nested": {
        "path": "payload"
      },
      "aggs": {
        "request": {
          "nested": {
            "path": "payload.request"
          },
          "aggs": {
            "data": {
              "nested": {
                "path": "payload.request.data"
              },
              "aggs": {
                "charging": {
                  "nested": {
                    "path": "payload.request.data.chargingPeriods"
                  },
                  "aggs": {
                    "my_buckets": {
                      "composite": {
                        "sources": [
                          {
                            "sessionId": {
                              "terms": {
                                "field": "payload.request.data.chargingPeriods.groupId"
                              }
                            }
                          },
                          {
                            "date": {
                              "date_histogram": {
                                "field": "payload.request.data.chargingPeriods.startDateTime",
                                "fixed_interval": "2m",
                                "format": "MM/dd/yyyy - hh:mm:ss",
                                "order": "asc"
                              }
                            }
                          }
                        ]
                      },
                      "aggregations": {
                        "metricAgg": {
                          "max": {
                            "field": "payload.request.data.chargingPeriods.power"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "query": {
    "terms": {
      "messageType": [
        "test"
      ]
    }
  }
}

结果:

代码语言:javascript
复制
            {
              "key" : {
                "sessionId" : "563",
                "date" : "10/13/2022 - 05:40:00"
              },
              "doc_count" : 1,
              "metricAgg" : {
                "value" : 9.62857
              }
            },
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74230010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档