elasticsearch聚合查询之基于查询结果的聚合、基于聚合结果的聚合、基于聚合结果的查询

1、查询的结果聚合:先执行查询,在查询结果的基础上聚合

复制代码
GET how2java/product/_search //求价格大于1千的商品的价格平均值
{
  "size": 0,
  "query": {
    "range": {
      "price": {
        "gt": 10000
      }
    }
  },
  "aggs": {
    "avg_price": {
      "avg": {
        "field": "price"
      }
    }
  }
}
复制代码

结果:

复制代码
{
  "took": 3,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 2072,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "avg_price": {
      "value": 26412.76833976834
    }
  }
}
复制代码

基于查询结果的聚合 并在聚合中再次执行查询:两次查询的交集用于聚合

复制代码
GET how2java/product/_search
{
  "size": 0,
  "query": {    //查询1
    "range": {
      "price": {
        "gt": 10000
      }
    }
  },
  "aggs": {
    "avg_price": {
      "avg": {
        "field": "price"
      }
    },
    "avg_price2": {
      "filter": {  //查询2
        "range": {
          "price": {
            "gt": 50000
          }
        }
      },
      "aggs": {
        "avg_price22": {  //查询1和查询2的交集用于本次聚合
"avg": { "field": "price" } } } } } }

复制代码
取消查询结果案例
复制代码
GET how2java/product/_search  
{
  "size": 0,
  "query": {   //查询1
    "range": {
      "price": {
        "gt": 10000
      }
    }
  },
  "aggs": {
    "avg_price": {
      "avg": {
        "field": "price"
      }
    },
    "avg_price2": {
      "global": {},  //查询1的查询结果不会作用于本次聚合
     "aggs": { "avg_price22": { "avg": { "field": "price" } } } } } }
复制代码

 

2、基于聚合结果的聚合: 二次聚合

复制代码
GET how2java/product/_search  //求每个地域下商品的平均价格
{
  "size": 0,
  "aggs": {
    "place_bucket": {  //先按地域分桶
      "terms": {
        "field": "place.keyword",
        "size": 100
        
      },
      "aggs": {   //在地域桶的同级求平均价格
        "avg_price": {
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}
复制代码

 

3、基于聚合结果的查询:这个说法不准确,其实就是不想让查询的结果作用于聚合(查询和聚合各干各的)

复制代码
GET how2java/product/_search   //查询商品价格大于50000的数据,同时聚合所有商品的平均价格
{
  "post_filter": {      //不同在于query查询时 query会基于查询结果聚合,而post_filter不影响聚合
    "range": {
      "price": {
        "gt": 50000
      }
    }
  },
  "aggs": {
    "avg_price": {
      "avg": {
        "field": "price"
      }
    }
  }
}
复制代码

基于聚合结果的查询的用处比如如下场景

复制代码
GET how2java/product/_search  //查询每个地域商品的数量,并查询某个地域商品的详细信息
{
  "post_filter": {
    "term": {
      "place.keyword": "上海"
    }
  },
  "aggs": {
    "place_bucket": {   //按地域分桶
      "terms": {
        "field": "place.keyword"
      }
    }
  }
}
复制代码

结果如下: 查询和聚合各干各的互不干扰

 

posted @   曹伟666  阅读(158)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示