【问题标题】:elasticsearch min and max aggs on other aggregation results其他聚合结果上的 elasticsearch min 和 max aggs
【发布时间】:2017-10-29 12:14:29
【问题描述】:

我试图在 elasticsearch 中找到聚合结果的最小值和最大值。什么查询将允许它首先按字段聚合,然后执行每月子聚合以获取该字段的每月数据,然后在这些每月计算的指标中找到最小值和最大值。 我一直在寻找minmax。以下要求的其余部分是我的查询

问题可以表述为:任何国家/地区的最大和最小交易量(考虑所有月份)是多少? 这是我尝试过的查询:

{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "Id": "7466swy7893jgs225"
          }
        }
      ]
    }
  },
  "aggs": {
    "dimension": {
      "terms": {
        "field": "country"
      },
      "aggs": {
        "MoM": {
          "date_histogram": {
            "field": "date",
            "interval": "month",
            "format": "MMM YY"
          },
          "aggs": {
            "totalValue": {
              "sum": {
                "field": "Transactions"
              }
            }
          }
        }
      }
    }
  },
  "size": 0

}

这是我得到的输出:

   {
    "aggregations": {
    "dimension": {
    "doc_count_error_upper_bound": 0,
    "sum_other_doc_count": 0,
    "buckets": [
    {
        "key": "USA",
        "doc_count": 392,
        "MoM": {
            "buckets": [
            {
            "key_as_string": "jan 16",
            "key": 1462060800000,
            "doc_count": 31,
            "totalValue": { "value": 352 }
            },
            {
            "key_as_string": "Feb 16",
            "key": 1462060800000,
            "doc_count": 31,
            "totalValue": { "value": 429 }
            }
         ??????????????/MIN and MAX of 352 AND 429
          ]
        }
    },
    {
        "key": "Bhutan",
        "doc_count": 392,
        "MoM": {
            "buckets": [
            {
            "key_as_string": "Jan 16",
            "key": 1462060800000,
            "doc_count": 31,
            "totalValue": {"value": 750 }
            }
            ,
            {
            "key_as_string": "Feb 16",
            "key": 1464739200000,
            "doc_count": 30,
            "totalValue": {"value": 827 }
        }
          ??????????????/MIN and MAX of 750 AND 827

      ]
     }
  }
 ]
 }
 }}

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    试试下面的查询。 在 aggs 字段中添加最小和最大指标。

    {
      "query": {
        "bool": {
          "must": [
            {
              "term": {
                "Id": "7466swy7893jgs225"
              }
            }
          ]
        }
      },
      "aggs": {
        "dimension": {
          "terms": {
            "field": "country"
          },
          "aggs": {
            "MoM": {
              "date_histogram": {
                "field": "date",
                "interval": "month",
                "format": "MMM YY"
              },
              "aggs": {
                "totalValue": {
                  "sum": {
                    "field": "Transactions"
                  }
                },
                "min":{
                  "min":{
                    "field":"Transactions"
                  }
                },
                "max":{
                  "max":{
                    "field":"Transactions"
                  }
                }
              }
            }
          }
        }
      },
      "size": 0
    }
    

    【讨论】:

    • 当我想按交易字段查找最小值和最大值时,此查询将起作用。但我的问题是找到 MoM 聚合的最小值和最大值(它给出了几个月的桶,如我上面当前的输出所示)。它可以改写为任何国家的最大和最小交易(考虑所有月份)跨度>
    【解决方案2】:

    您需要使用Pipeline Aggregation.。试试Max BucketMin Bucket 聚合

    {
    "size": 0,
    "aggs": {
      "dimension": {
         "terms": {
            "field": "country"
         },
         "aggs": {
            "MoM": {
               "date_histogram": {
                  "field": "date",
                  "interval": "month",
                  "format": "MMM YY"
               },
               "aggs": {
                  "totalValue": {
                     "sum": {
                        "field": "transactions"
                     }
                  }
               }
            },
            "max_monthly_temp": {
               "max_bucket": {
                  "buckets_path": "MoM>totalValue"
               }
            },
            "min_monthly_temp": {
               "min_bucket": {
                  "buckets_path": "MoM>totalValue"
                  }
                }
             }
          }
       }
     }
    

    输出会有点像:

     "buckets": [
            {
               "key": "India",
               "doc_count": 5,
               "MoM": {
                  "buckets": [
                     {
                        "key_as_string": "Feb 17",
                        "key": 1485907200000,
                        "doc_count": 3,
                        "totalValue": {
                           "value": 260
                        }
                     },
                     {
                        "key_as_string": "Mar 17",
                        "key": 1488326400000,
                        "doc_count": 1,
                        "totalValue": {
                           "value": 115
                        }
                     },
                     {
                        "key_as_string": "Apr 17",
                        "key": 1491004800000,
                        "doc_count": 1,
                        "totalValue": {
                           "value": 5
                        }
                     }
                  ]
               },
               "max_monthly_temp": {
                  "value": 260,
                  "keys": [
                     "Feb 17"
                  ]
               },
               "min_monthly_temp": {
                  "value": 5,
                  "keys": [
                     "Apr 17"
                  ]
               }
            },
        ......
          ]
    

    希望这会有所帮助..

    【讨论】:

    • 我一定会试一试的。它看起来正是我想要的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 2021-10-19
    • 2016-11-05
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多