130.ElasticSearch(五):es聚合查询,nested数组

目录

一、聚合索引

1.bucket和metric概念

2.操作案例

二、nested object

1.问题

2.原因

3.案例

三、打赏请求


一、聚合索引

1.bucket和metric概念

bucket是一个聚合搜索时的数据分组。

metric就是对一个bucket数据执行的统计分析。

类比sql,bucket类似于group by,metric类似于sum(),count()等聚合语法。

2.操作案例

先新增一些数据:

PUT /cars2
{
  "mappings": {
    "properties": {
      "price": {
        "type": "long"
      },
      "color": {
        "type": "keyword"
      },
      "brand": {
        "type": "keyword"
      },
      "model": {
        "type": "keyword"
      },
      "sold_date": {
        "type": "date"
      },
     
      "remark":{
        "type": "text",
        "analyzer": "ik_max_word"
      }

    }
  }
}

POST /cars2/_bulk
{"index":{}}
{"price":258000,"color":"金色","brand":"大众","model":"大众迈腾","sold_date":"2021-08-13","remark":"大众中档车"}
{"index":{}}
{"price":123000,"color":"金色","brand":"大众","model":"大众速腾","sold_date":"2021-09-13","remark":"大众神车"}
{"index":{}}
{"price":239800,"color":"白色","brand":"标志","model":"标志508","sold_date":"2021-07-13","remark":"标志品牌全球上市车型"}
{"index":{}}
{"price":148800,"color":"白色","brand":"标志","model":"标志408","sold_date":"2021-06-13","remark":"比较大的紧凑汽车"}
{"index":{}}
{"price":1998000,"color":"黑色","brand":"大众","model":"大众辉腾","sold_date":"2021-05-13","remark":"大众最让人肝疼的汽车"}
{"index":{}}
{"price":218000,"color":"红色","brand":"奥迪","model":"奥迪A4","sold_date":"2021-04-13","remark":"小资车型"}
{"index":{}}
{"price":489000,"color":"黑色","brand":"奥迪","model":"奥迪A4","sold_date":"2021-03-13","remark":"政府用车"}
{"index":{}}
  

(1)根据color分组统计销售数量

GET /cars2/_search
{
  "size": 0, 
  "aggs": {
    "group_by_color": {
      "terms": {
        "field": "color",
        "order": {
          "_count": "desc"
        }
      }
    }
  }
}

 (2)统计不同color汽车的平均价格

先进行一次color分组,在进行一次价格聚合,套娃了

GET /cars2/_search
{
  "size": 0,
  "aggs": {
    "group_by_color": {
      "terms": {
        "field": "color",
        "order": {
          "avg_by_price": "asc"
        }
      },
      "aggs": {
        "avg_by_price": {
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}

(3)统计不同color不同brand中车辆的平均价格

GET /cars2/_search
{
  "size": 0,
  "aggs": {
    "group_by_color": {
      "terms": {
        "field": "color",
        "order": {
          "avg_by_price_color": "asc"
        }
      },
      "aggs": {
        "avg_by_price_color": {
          "avg": {
            "field": "price"
          }
        },
        "group_by_brand": {
          "terms": {
            "field": "brand",
            "order": {
              "avg_by_price_brand": "desc"
            }
          },
          "aggs": {
            "avg_by_price_brand": {
              "avg": {
                "field": "price"
              }
            }
          }
        }
      }
    }
  }
}

 (4)统计不同color中的最大和最小价格,总价

GET /cars2/_search
{
  "size": 0, 
  "aggs": {
    "group_by_color": {
      "terms": {
        "field": "color"
      },
      "aggs": {
        "max_price": {
          "max": {
            "field": "price"
          }
        },
         "min_price": {
          "min": {
            "field": "price"
          }
        },
         "suum_price": {
          "sum": {
            "field": "price"
          }
        }
      }
    }
  }
}

二、nested object

1.问题

我们查询地址时,有两条数据,省市为上海,浦东。江苏,扬州。

然后使用:

bool.must.match.address.province="上海"

bool.must.match.address.city="扬州"

事实上应该一个都查询不出来,但是他却都能查出来,这是不对的

2.原因

普通的数组在es中会被扁平化处理,即如果字段需要分词,会将分词数据保存在对应字段中,类似于每一个字段都用or来查询。

简单理解,nested object就是数组的精确匹配

nested object数据类型es在保存的时候不会有扁平化处理

3.案例

先创建nested格式数组:

PUT /user_index
{
  "mappings": {
    "properties": {
      "login_name":{
        "type": "keyword"
      },
      "age":{
        "type": "short"
      },
      "address":{
        "type": "nested",
        "properties": {
          "province":{
            "type":"keyword"
          },
          "city":{
            "type":"keyword"
          },
          "street":{
            "type":"keyword"
          }
        }
      }
    }
  }
}

设置数据:

PUT /user_index/_doc/1
{
  "login_name":"jack",
  "age":"25",
  "address":[
    {
      "province":"北京",
      "city":"北京",
      "street":"aaa路"
    },
    {
      "province":"天津",
      "city":"天津",
      "street":"bbb路"
    }
    ]
}

PUT /user_index/_doc/2
{
  "login_name":"rose",
  "age":"21",
  "address":[
    {
      "province":"河北",
      "city":"廊坊",
      "street":"ccc路"
    },
    {
      "province":"天津",
      "city":"天津",
      "street":"ddd路"
    }
    ]
}

查询 :

GET /user_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "address",
            "query": {
              "bool": {
                "must": [
                  {
                    "match": {
                      "address.province": "北京"
                    }
                  },
                  {
                    "match": {
                      "address.city": "北京"
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}

三、打赏请求

如果本篇博客对您有所帮助,打赏一点呗,谢谢了呢~

猜你喜欢

转载自blog.csdn.net/qq_40594696/article/details/119676457
今日推荐