首页 > 其他分享 >Elasticsearch 地理搜索聚合

Elasticsearch 地理搜索聚合

时间:2023-12-18 23:00:34浏览次数:40  
标签:search 聚合 point qgpoi shape 搜索 Elasticsearch geo

 

数据类型 查询功能 聚合功能

geo_point

geo_shape

[geo shape]查询文档的geo-
shape是否跟查询指定geo-shap
e相交、内嵌、不相交。


[geo bounding box] 查询文
档的point是否在指定的矩形范围
内。


[geo distance]:查询中心点指
定半径范围内的文档
聚合功能

[geo polygon]查询文档的po
int是否在指定的多边形范围内。

[geo bounds]给指定条下的
坐标点画一个框


[geo distance]按距离中心点
的范围聚台,比如:1km以内,
1~10km,10km以外


[ geohash grid]按 geohash
聚合,可指定geohash精度。

 

 

一、地理数据类型

geo_point 地理点类型

geojson、wkt、geohash、对象

geo_shape 地理形状类型

Point 、LineString 、Polygon 、MultiPoint 、MultiLineString 、MultiPolygon 、GeometryCollection 、envelope 、circle 

二、地理查询

 

geo_bounding_box 矩形过滤

 

# 范围查询 支持geo_point 和 geo_shape
GET qgpoi/_search
{
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      },
      "filter": {
        "geo_bounding_box": {
          "point": {
            "top_left": {
              "lat": 29.4674833601239,
              "lon": 106.478643978476
            },
            "bottom_right": {
              "lat": 28.4674833601239,
              "lon": 107.478643978476
            }
          }
        }
      }
    }
  }
}

geo_distance 距离查询(圆形过滤)

# 距离查询
GET qgpoi/_search
{
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      },
      "filter": {
        "geo_distance": {
          "distance": "200m",
          "point": {
            "lat": 29.4674833601239,
            "lon": 106.478643978476
          }
        }
      }
    }
  }
}

geo_polygon 多边形查询(已过时)

# 多边形查询(7.12版本废弃)
GET qgpoi/_search
{
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      },
      "filter": {
        "geo_polygon": {
          "point": {
            "points": [
              { "lat": 29, "lon": 104 },
              { "lat": 29, "lon": 105 },
              { "lat": 29, "lon": 106 }
            ]
          }
        }
      }
    }
  }
}

geo_shape 地理形状查询

# geo_shape查询 预置查询范围
PUT /shapes
{
  "mappings": {
    "properties": {
      "location": {
        "type": "geo_shape"
      }
    }
  }
}

PUT /shapes/_doc/deu
{
  "location": {
    "type": "envelope",
    "coordinates" : [[107,29], [106,28]]
  }
}

GET qgpoi/_search
{
  "query": {
    "bool": {
      "filter": {
        "geo_shape": {
          "point": {
            "indexed_shape": {
              "index": "shapes",
              "id": "deu",
              "path": "location"
            }
          }
        }
      }
    }
  }
}
# 按矩形bbox范围查询
GET qgpoi/_search { "query": { "bool": { "must": { "match_all": {} }, "filter": { "geo_shape": { "point": { "shape": { "type": "envelope", "coordinates": [ [ 107, 29 ], [ 106, 28 ] ] }, "relation": "within" } } } } } }

二、地理聚合

Geo distance 聚合

Elasticsearch 允许您针对 GeoPoint 执行聚合:地理距离聚合。使用文档中可用的 location 字段,我们将聚合以下五个范围内的其他文档:

不到 10 公里
从 10 公里到 20 公里
从 20 公里到 50 公里
从 50 公里到 100 公里
100 公里以上

POST qgpoi/_search?filter_path=aggregations
{
  "size": 0,
  "aggs": {
    "NAME": {
      "geo_distance": {
        "field": "point",
        "origin": {
          "lat": 39.970718,
          "lon": 116.325747
        },
        "ranges": [
          {
            "to": 10
          },
          {
            "from": 10,
            "to": 20
          },
          {
            "from": 20,
            "to": 50
          },
          {
            "from": 50,
            "to": 100
          },
          {
            "from": 100
          }
        ]
      }
    }
  }
}

Geo bounds 聚合

计算边界范围

POST qgpoi/_search?filter_path=aggregations
{
  "size": 0,
  "aggs": {
    "box": {
      "geo_bounds": {
        "field": "point",
        "wrap_longitude": true
      }
    }
  }
}
    • field:这是包含文档地理点的字段。
    • wrap_longitude:这是一个可选参数,指定是否应允许边界框与国际日期变更线重叠(默认为 true)。

Geo centroid 聚合

计算中心点

POST qgpoi/_search?filter_path=aggregations
{
  "size": 0,
  "aggs": {
    "centroid": {
      "geo_centroid": {
        "field": "point"
      }
    }
  }
}
    • precision(默认 6):即从 0 到 29 的缩放级别。29 值是一个高精度值,覆盖大约 10 cm x 10 cm 的土地。 通常,更常用的值在 6 到 12 之间。

# Geo tile 聚合

使用 Elasticsearch 在地图上显示数据是 Elasticsearch 用户之间非常常见的模式。 最常用的地图格式之一是瓦片格式,其中地图被分成几个小的正方形部分,当需要渲染位置时,服务器会获取该位置附近的瓦片。

POST qgpoi/_search?filter_path=aggregations
{
  "size": 0,
  "aggs": {
    "tiles": {
      "geotile_grid": {
        "field": "point",
        "precision": 5
      }
    }
  }
}
# 按条件过滤Geo tile聚合
GET qgpoi/_search
{
  "size": 0,
  "track_total_hits": false,
  "aggs": {
    "gridSplit": {
      "geotile_grid": {
        "bounds": {
          "top_left": [
            -180,
            85.05113
          ],
          "bottom_right": [
            180,
            -66.51326
          ]
        },
        "field": "point",
        "precision": 8,
        "size": 65535,
        "shard_size": 65535
      },
      "aggs": {
        "gridCentroid": {
          "geo_centroid": {
            "field": "point"
          }
        }
      }
    }
  },
  "fields": [],
  "script_fields": {},
  "stored_fields": [
    "*"
  ],
  "runtime_mappings": {},
  "_source": {
    "excludes": []
  },
  "query": {
    "bool": {
      "must": [],
      "filter": [
        {
          "bool": {
            "must": [
              {
                "exists": {
                  "field": "point"
                }
              },
              {
                "geo_bounding_box": {
                  "point": {
                    "top_left": [
                      -180,
                      86.65723
                    ],
                    "bottom_right": [
                      180,
                      -66.51326
                    ]
                  }
                }
              }
            ]
          }
        }
      ],
      "should": [],
      "must_not": []
    }
  }
}

 

geohash_grid 聚合

 使用 geohash_grid 聚合,可以根据文档的 geohash 值对文档进行分组

GET qgpoi/_search
{
  "size" : 0,
  "aggs" : {
     "grouped" : {
        "geohash_grid" : {
           "field" : "point",
           "precision" : 2
        }
     }
  }
}

geohex grid聚合

对于 geo_hex 网格,它只能用于 geo_point 字段,付费

GET qgpoi/_search?filter_path=aggregations
{
  "size" : 0,
  "aggs" : {
     "grouped" : {
        "geohex_grid" : {
           "field" : "point",
           "precision" : 1
        }
     }
  }
}

 

 官网地址

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-geo-shape-query.html

 

标签:search,聚合,point,qgpoi,shape,搜索,Elasticsearch,geo
From: https://www.cnblogs.com/libin2015/p/17912372.html

相关文章

  • P1464 Function(记忆化搜索)(宏定义)
    P1464Function记忆化搜索(引用洛谷上题解的原话,自己是个废物想不到):只要确定好数组和范围就可以把搜索中的每一次结果存起来,正在搜索的项目中也可以用到这些信息。这便是记忆化搜索的核心与关键:自定义函数与数组达到“实时互动的状态”。好处通过数组直接记录值,减少重复递归......
  • elasticsearch学习1
    springData集成的各种数据框架版本和具体spring使用的各数据项目的版本不是同一个概念,默认都是各个框架的最新版 各版本框架  Outofmaintenance 停止维护 一直没搞清楚springboot中的依赖版本和真正在电脑上下载的服务器上的数据库集群版本有什么区别,区别就是......
  • SAP搜索帮助的限制值范围样式
    样式一:点击下拉框,输入筛选数据,筛选搜索帮助列表样式二:点击漏斗,输入筛选数据,筛选搜索帮助列表参数设置:不同的样式,通过账号的参数设置决定第一种样式:没有配置F4METHOD,或者配置了参数值为ActiveX第二种样式:配置了F4METHOD且值为NoActiveX 定期更文,欢迎关注    ......
  • Qt搜索本机网卡对应网段的在线设备
    需求:销售给我的需求是找出哪些IP是没有被占用的,所以我要先找出已经被占用的IP 项目是Qt开发的,所以在网上搜索了下,搜索到的实现方式都是:QHostInfo::lookupHost,但是这种方式,我发现有部分已经占用了的IP还是搜索不出来,遂放弃这种方式。//QHostInfo::lookupHost方式搜索占用的I......
  • 人工智能-A*算法-最优路径搜索实验
    上次学会了《A*算法-八数码问题》,初步了解了A*算法的原理,本次再用A*算法完成一个最优路径搜索实验。 一、实验内容1.设计自己的启发式函数。2.在网格地图中,设计部分障碍物。3.实现A*算法,搜索一条最优路径。 二、A*算法实现步骤1.初始化:设置起始节点和目标节点,并创建一......
  • java实现二叉树前序搜索输出深度完整代码
    importjava.util.Scanner;//1:无需package//2:类名必须Main,不可修改classTreeNode{publicintval;publicTreeNodeleft;publicTreeNoderight;publicTreeNode(intval){this.val=val;this.left=null;this.right=null;}}p......
  • ElasticSearch之Index modules
    索引的参数,分为两类:静态参数,仅支持在创建索引时指定,或者关闭索引后指定。动态参数,允许在索引工作期间指定或者修改。静态参数index.number_of_shards默认值为1。本参数用于控制主分片的数量,仅支持在创建时指定,对于已关闭的索引,修改本参数不会生效。es.index.max_number_o......
  • elasticsearch get查询方式
    api:(elasticsearch版本7.3)#通过id查询GET<index>/_doc/<_id>#判断是否存在HEAD<index>/_doc/<_id>#通过id查询GET<index>/_source/<_id>#判断是否存在HEAD<index>/_source/<_id>#查询指定index的多个文档GET/<index>/_mget#查询多个文......
  • elasticsearch 文档更新操作:update和update_by_query
    API:(elasticsearch版本7.3)POST/<index>/_update/<_id>POST/<index>/_update_by_query1.POST/<index>/_update/<_id>支持脚本,可以更新、删除或跳过修改文档。更新文档部分内容,传递部分文档,将其合并到现有文档中。#测试--post/update脚本修改文档POST/king_test_p......
  • elasticsearch 文档删除操作:delete和delete_by_query
    api:(elasticsearch版本7.3)#删除指定id的文档DELETE/<index>/_doc/<_id>#按查询条件删除POST/<index>/_delete_by_query1.DELETE/<index>/_doc/<_id>删除指定id的文档#测试--删除文档DELETE/king_test_person/_doc/223/2.POST/<index>/_dele......