目录
一、聚合索引
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": "北京"
}
}
]
}
}
}
}
]
}
}
}
三、打赏请求
如果本篇博客对您有所帮助,打赏一点呗,谢谢了呢~