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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探