ElasticSearch介绍和基本用法(三)

4.9 聚合查询

ES的聚合查询和mysql 的聚合查询类似,ES的聚合查询相比mysql 要强大得多。ES提供的统计数据的方式多种多样。

#ES 聚合查询的RSTFul 语法
POST /index/type/_search
{
    "aggs":{
        "(名字)agg":{ // 自己取名字
            "agg_type":{
                "属性":"值"
            }
        }
    }
}

4.9.1 去重计数聚合查询

去重计数,cardinality 先将返回的文档中的一个指定的field进行去重,统计一共有多少条

# 去重计数 查询 province
POST /sms-logs-index/sms-logs-type/_search
{
  "aggs": {
    "provinceAgg": {
      "cardinality": {
        "field": "province"
      }
    }
  }
}

4.9.2 范围统计
统计一定范围内出现的文档个数,比如,针对某一个field 的值再0100,100200,200~300 之间文档出现的个数分别是多少

范围统计可以针对普通的数值,针对时间类型,针对ip类型都可以响应。

  • 数值 range
  • 时间 date_range
  • ip ip_range
#针对数值方式的范围统计  from 带等于效果 ,to 不带等于效果
POST /sms-logs-index/sms-logs-type/_search
{
  "aggs": {
    "agg": {
      "range": {
        "field": "fee",
        "ranges": [
          // 最小到30
          {
            "to": 30
          },
          // 30<= <60
          {
            "from": 30,
            "to": 60
          },
          // 60<=
          {
            "from": 60
          }
        ]
      }
    }
  }
}
#时间方式统计 2000以前 和 2000以后的
POST /sms-logs-index/sms-logs-type/_search
{
  "aggs": {
    "agg": {
      "date_range": {
        "field": "sendDate",
        "format": "yyyy", // 年
        "ranges": [
          {
            "to": "2000"
          },{
            "from": "2000"
          }
        ]
      }
    }
  }
}
#ip 方式 范围统计
POST /sms-logs-index/sms-logs-type/_search
{
  "aggs": {
    "agg": {
      "ip_range": {
        "field": "ipAddr",
        "ranges": [
          {
            // 小于
            "to": "127.0.0.8"
          },
          {
            "from": "127.0.0.8"
          }
        ]
      }
    }
  }
}

4.9.3 统计聚合

他可以帮你查询指定field 的最大值,最小值,平均值,平方和…

使用 extended_stats

# 统计聚合查询 extended_stats
POST /sms-logs-index/sms-logs-type/_search
{
  "aggs": {
    "agg": {
      "extended_stats": {
        "field": "count"
      }
    }
  }
}
# 结果
"aggregations" : {
    "NAME" : {
      "count" : 1,
      "min" : 100000.0,
      "max" : 100000.0,
      "avg" : 100000.0,
      "sum" : 100000.0,
      "sum_of_squares" : 1.0E10,
      "variance" : 0.0,
      "std_deviation" : 0.0,
      "std_deviation_bounds" : {
        "upper" : 100000.0,
        "lower" : 100000.0
      }
    }
  }

4.9.4 其他聚合查询 查看官方文档
https://www.elastic.co/guide/en/elasticsearch/reference/6.8/search-aggregations-metrics-weight-avg-aggregation.html

4.10 地图经纬度搜索

#创建一个经纬度索引,指定一个 name ,一个location
PUT /map
{
  "settings": {
    "number_of_shards": 5,
    "number_of_replicas": 1
  },
  "mappings": {
    "map":{
      "properties":{
        "name":{
          "type":"text"
        },
        "location":{
          "type":"geo_point" //经纬度类型
        }
      }
    }
  }
}

#添加测试数据
PUT /map/map/1
{
  "name":"天安门",
  "location":{
    "lon": 116.403694,
    "lat":39.914492
  }
}

PUT /map/map/2
{
  "name":"百望山",
  "location":{
    "lon": 116.26284,
    "lat":40.036576
  }
}

PUT /map/map/3
{
  "name":"北京动物园",
  "location":{
    "lon": 116.347352,
    "lat":39.947468
  }
}

4.10.1 ES 的地图检索方式

geo_distance:直线距离检索方式
geo_bounding_box:以2个点确定一个矩形,获取再矩形内的数据
geo_polygon:以多个点,确定一个多边形,获取多边形的全部数据

####4.10.2 基于RESTFul 实现地图检索

#geo_distance 
POST /map/map/_search
{
  "query": {
    "geo_distance":{
      // 确定一个点
      "location":{
        "lon":116.434739,
        "lat":39.909843
      },
      // 确定半径 单位是米
      "distance":20000,
      // 指定形状为圆形
      "distance_type":"arc"
    }
  }
}
#geo_bounding_box
POST /map/map/_search
{
  "query":{
    "geo_bounding_box":{
      "location":{
        "top_left":{
          "lon":116.327805,
          "lat":39.95499
        },
        "bottom_right":{
          "lon": 116.363162,
          "lat":39.938395
        }
      }
    }
  }
}
#geo_polygon
POST /map/map/_search
{
  "query":{
    "geo_polygon":{
      "location":{
       // 指定多个点确定 位置
       "points":[
         {
           "lon":116.220296,
           "lat":40.075013
         },
          {
           "lon":116.346777,
           "lat":40.044751
         },
         {
           "lon":116.236106,
           "lat":39.981533
         } 
        ]
      }
    }
  }
}

————————————————
版权声明:本文为CSDN博主「tang_yu_mac」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/tang_yu_mac/article/details/109412866

posted @ 2022-09-13 15:55  jiuchengi  阅读(51)  评论(0编辑  收藏  举报