ElasticSearch聚合查询

发布于:2024-03-11 ⋅ 阅读:(55) ⋅ 点赞:(0)
  1. 数据准备
索引创建
PUT product
{
  "mappings": {
    "properties": {
      "createtime": {
        "type": "date"
      },
      "desc": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        },
        "analyzer": "ik_max_word"
      },
      "lv": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "name": {
        "type": "text",
        "analyzer": "ik_max_word",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "pice": {
        "type": "long"
      },
      "tags": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "type": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      }
    }
  }
}
数据插入
PUT  /product/_doc/1
{
  "name":"小米手机",
  "desc":"手机中的战斗机",
  "pice":3999,
  "lv":"旗舰机",
  "type":"手机",
  "createtime":"2020-10-01",
  "tags":["性价比","发烧","不卡顿"]
}

PUT  /product/_doc/2
{
  "name":"小米NFC手机",
  "desc":"支持全功能NFC,手机中的滑翔机",
  "pice":4999,
  "lv":"旗舰机",
  "type":"手机",
  "createtime":"2020-05-21",
  "tags":["性价比","发烧","公交卡"]
}

分组查询

# 不同标签商品数量(按照结果数量降序),和不同类型的商品数量
GET /product/_search
{
  "size": 0, 
  "aggs": {
    "tags_group": {
      "terms": {
        "field": "tags.keyword",
        "order": {
          "_count": "desc"
        }
      }
    },
    "type_group": {
      "terms": {
        "field": "type.keyword"
      }
    }
  }
}

指标查询

查询pice的最大值和平均值、以及所有指标聚合值
{
  "size": 0,
  "aggs": {
    "pice_avg": {
      "avg": {
        "field": "pice"
      }
    },
    "max_pice": {
      "max": {
        "field": "pice"
      }
    },
    "stats_pice": {
      "stats": {
        "field": "pice"
      }
    }
  }
}
根据name去重
{
  "size": 0, 
  "aggs": {
    "name_count": {
      "cardinality": {
        "field": "name.keyword"
      }
    }
  }
}

管道聚合

# 平均价格最低的商品分类
GET /product/_search
{
  "size": 0,
  "aggs": {
    "type_group": {
      "terms": {
        "field": "type.keyword"
      },
      "aggs": {
        "avg_pice": {
          "avg": {
            "field": "pice"
          }
        }
      }
    },
    "min_baucket":{
      "min_bucket": {
        "buckets_path": "type_group>avg_pice"
      }
    }
  }
}

基于查询结果的聚合

统计电视的平均价格
GET /product/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "type.keyword": {
              "value": "电视"
            }
          }
        }
      ]
    }
  },
  "aggs": {
    "tags_agg": {
      "avg": {
        "field": "pice"
      }
    }
  }
}

{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "type.keyword": {
              "value": "电视"
            }
          }
        }
      ]
    }
  },
  "aggs": {
    "tags_agg": {
      "avg": {
        "field": "pice"
      }
    }
  }
}
 针对聚合后的结果做过滤
{
  "aggs": {
    "tags_agg": {
      "terms": {
        "field": "tags.keyword"
      }
    }
  },
  "post_filter": {
    "term": {
      "tags.keyword": "性价比"
    }
  }
}

# 价格大于三千的 价格最小值,平均值 ,所有数据的平均值
GET /product/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "pice": {
              "gte": 3000
            }
          }
        }
      ]
    }
  },
  "size": 0,
  "aggs": {
    "min_pice": {
      "min": {
        "field": "pice"
      }
    },
    "avg_pice": {
      "avg": {
        "field": "pice"
      }
    },
    "all_avg_pic": {
      "global": {}, //取消了外层的条件过滤
      "aggs": {
        "avg_pic": {
          "avg": {
            "field": "pice"
          }
        }
      }
    },
    "muti_avg_pic": {
      "filter": {  // 结合外层条件取交集
        "range": {
          "pice": {
            "gte": 4000
          }
        }
      },
      "aggs": {
        "avg_pic": {
          "avg": {
            "field": "pice"
          }
        }
      }
    }
  }
}

聚合排序

过滤出手机耳机 再根据类型分组,计算各统计聚合值(平均,最大,最小),最好喝根据最小值排序
{
  "size": 0,
  "query": {
    "bool": {
      "filter": {
        "terms": {
          "type.keyword": [
            "手机",
            "耳机"
          ]
        }
      }
    }
  },
  "aggs": {
    "avg_tag_pice": {
      "terms": {
        "field": "type.keyword",
        "order": {
          "pic_stats.min": "desc"
        }
      },
      "aggs": {
        "pic_stats": {
          "stats": {
            "field": "pice"
          }
        }
      }
    }
  }
}

常用聚合函数

histogram 函数
统计价格在每个区段(间隔200)的产品数量
{
  "size": 0, 
  "aggs": {
    "pice_histogram": {
      "histogram": {
        "field": "pice",
        "interval": 200,  # 分割间隔
        "keyed": false,  # true,则返回 key_value形式
        "min_doc_count": 1, # 满足结果大于等于1的带才返回
        "missing": 0 #  空值默认
      }
    }
  }
}
date_histogram 函数
统计每月产品数量
{
  "size": 0, 
  "aggs": {
    "create_time_histogram": {
      "date_histogram": {
        "field": "createtime",
        "calendar_interval": "month",  # 分割间隔  "fixed_interval"  间隔小最大单位 天
        "format": "yyyy-MM",   # 日期格式
        "extended_bounds": {  # 统计数据时间区段
          "min": "2020-01",
          "max": "2020-12"
        },
        "order": { # 排序
          "_count": "desc"
        }
      }
    }
  }
}
统计每月产品数量,再做累加
{
  "size": 0, 
  "aggs": {
    "create_time_histogram": {
      "date_histogram": {
        "field": "createtime",
        "calendar_interval": "month",
        "min_doc_count": 0,
        "format": "yyyy-MM", 
        "extended_bounds": {
          "min": "2020-01",
          "max": "2020-12"
        }
      },
      "aggs": {  
        "sum_age": { # 求每月的总和
          "sum": {
            "field": "pice"
          }
        },
        "pice_cumulative_sum":{ # 累加每月总和
          "cumulative_sum": {
            "buckets_path": "sum_age"
          }
        }
      }
    }
  }
}
percentiles 函数 百分比占比统计, 数量越大统计越准确
{
  "size": 0, 
  "aggs": {
    "pice_percentiles": {
      "percentiles": {
        "field": "pice",
        "percents": [
          1,
          5,
          25,
          50,
          75,
          95,
          99
        ]
      }
    }
  }
}
percentile_ranks 函数 范围占比统计 数量越大统计越准确
{
  "size": 0, 
  "aggs": {
    "pice_percentiles": {
      "percentile_ranks": {
        "field": "pice",
        "values": [
          2000,
          4000,
          6000
        ]
      }
    }
  }
}







网站公告

今日签到

点亮在社区的每一天
去签到