Elasticsearch - 聚合查询(一)

普通字段聚合

# 使用数据
PUT /book/_doc/2
{
  "name": "java编程思想",
  "desc": "我们通常只需一天来审核你的信息。如果我们发现你的帐户确实未违反我们的社群守则,你便可以再为次使用Facebook官网。",
  "price": 10.91,
  "timestamp": "2024-01-02 1:55:12",
  "pic": "021.png",
  "tags": ["spring", "php"]
}

sql方式:
select price, count(*) as _count from book group by price

GET /book/_search
{
  "query": {
    "match_all": {}
  },
  "aggs": { # 聚合操作
    "as_group_by": { # 查询结果的别名
      "terms": { # 相当于group by
        "field": "price"
      }
    }
  }
}

  1. 查询出的聚合数据在aggregations下
  2. 查询出的数据包含index的原始数据 不是想要的只返回price,_count信息,可以通过size:0来解决
GET /book/_search
{
  "query": {
    "match_all": {}
  },
  "size": 0,
  "aggs": {
    "price_group_by": {
      "terms": {
        "field": "price"
      }
    }
  }
}

数组类型字段聚合

想要对tags字段进行聚合,像上边price一样写是不对的需要对tags字段设置Fielddata=true

PUT /book/_mapping
{
  "properties": {
    "tags": {
      "type": "text",
      "fielddata": true
    }
  }
}

GET /book/_search
{
  "query": {
    "match_all": {}
  },
  "size": 0,
  "aggs": {
    "tags_group_by": {
      "terms": {
        "field": "tags"
      }
    }
  }
}

查询后返回结果:

buckets:分组,类似group by

聚合tags 加上筛选条件

GET /book/_search
{
  "query": {
    "match": {
      "name": "php"
    }
  },
  "size": 0,
  "aggs": {
    "tags_group_by": {
      "terms": {
        "field": "tags"
      }
    }
  }
}

按照tags分组 并查询每个tag下的平均价格

GET /book/_search
{
  "query": {
    "match_all": {}
  },
  "size": 0,
  "aggs": {
    "group_by_tags": {
      "terms": { # 先分组
        "field": "tags"
      },
      "aggs": {
        "price_avg": {
          "avg": { # 后取平均值
            "field": "price"
          }
        }
      }
    }
  }
}

计算每个tag下的平均价格并倒序展示

group_by_tags里可以直接调用子聚合里边的字段

GET /book/_search
{
  "query": {
    "match_all": {}
  },
  "size": 0,
  "aggs": {
    "group_by_tags": {
      "terms": {
        "field": "tags",
        "order": {
          "price_avg": "desc"
        }
      },
      "aggs": {
        "price_avg": {
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}

按照价格区间分组,之后再按照tag分组,再查询每个组的平均价格并倒序展示

拆分:

  1. 价格区间分组
  2. 按照tag分组
  3. 平均价格
  4. 倒序排序
GET /book/_search
{
  "size": 0,
  "aggs": {
    "price_range": {
      "range": { # 1. 价格区间分组
        "field": "price",
        "ranges": [
          {
            "from": 0,
            "to": 7.8
          },
          {
            "from": 7.8,
            "to": 100
          }
        ]
      },
      "aggs": {
        "group_by_tags": {
          "terms": { # 2. 按照tag分组
            "field": "tags",
            "order": { # 4. 倒序排序
              "price_avg": "desc"
            }
          },
          "aggs": {
             "price_avg": {
              "avg": { # 3. 平均价格
                "field": "price"
              }
            }
          }
        }
      }
    }
  }
}
posted @ 2024-04-26 11:36  py卡卡  阅读(2)  评论(0编辑  收藏  举报