elasticsearch geo_point 地理位置过滤 按经度排序

本文介绍了如何在Elasticsearch中利用geo_point类型进行地理位置过滤和按经度排序。首先,创建包含坐标信息的'type'='geo_point'字段,接着展示如何构建屏幕范围内的过滤条件、以特定点为中心的过滤以及按距离排序的方法。通过示例代码和官方资料,详细阐述了操作过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

elasticsearch 支持强大的经纬度坐标过滤。

1、首先要建立坐标类型的字段'type' ='geo_point'


     es存储的值是这样的:

"poi": [
          113.40780444444,
          22.920241666667
      ],


2、构建各种经纬度过滤条件

a、获取屏幕范围内,只需屏幕的两个对角的坐标。

{
        "from": 0,
        "size": 20,
        "query": {
            "filtered": {
                "query": {
                    "match_all": []
                },
                "filter": {
                  "geo_bounding_box" : { <

<think>嗯,用户问的是Elasticsearch中的geo_shape类型,我需要先回忆一下相关知识。首先,geo_shape用于处理地理空间数据,比如多边形、线、点这些形状。和geo_point的区别在于,geo_point只处理经纬度点,而geo_shape可以处理更复杂的形状。 然后,我应该说明geo_shape的应用场景,比如地理围栏、区域搜索之类的。可能需要提到支持的形状类型,比如Point、LineString、Polygon,还有Envelope这些。索引方法也很重要,比如默认是BKD树,或者可以选其他空间前缀树的分辨率参数。 接着,要讲如何定义映射,给出一个示例的mapping结构。查询部分需要举几个例子,比如geo_shape查询,判断点是否在多边形内,或者两个形状是否有交集。可能还要提到精度和性能的权衡,因为更高的精度需要更多存储和计算资源。 另外,用户可能需要知道如何优化查询性能,比如调整tree_levels或者precision参数。还有注意事项,比如坐标顺序是[经度, 纬度],符合GeoJSON标准,但和geo_point的纬度在前不同,容易出错。 需要确认是否遗漏了什么,比如空间关系(intersects, within等),或者如何处理复杂形状的索引。可能还要提一下ES版本是否有变化,虽然用户没有指定版本,但一般按最新稳定版本来解释比较稳妥。 最后,结构要清晰,分点说明,比如定义、应用场景、数据结构、查询方式、注意事项。确保用中文,避免技术术语不准确,同时保持口语化,让用户容易理解。</think>好的,我来分步骤为您介绍Elasticsearch中的`geo_shape`类型: 1. **基本定义** - `geo_shape`是Elasticsearch专门用于存储和查询地理空间形状的数据类型 - 可以处理点(Point)、线(LineString)、多边形(Polygon)等复杂地理图形 - 与`geo_point`的区别:后者仅存储单个坐标点,前者可处理复杂空间关系 2. **核心应用场景** - 地理围栏(Geofencing):判断设备点是否在指定区域内 - 区域覆盖查询:查找与某个图形相交/包含的文档 - 物流路径规划:处理路线与地理区域的关系 - 地理空间分析:计算形状之间的交集、包含等关系 3. **数据结构示例** ```json { "mappings": { "properties": { "location": { "type": "geo_shape", "tree": "quadtree", // 可选参数 "precision": "100m" // 精度控制 } } } } ``` 4. **支持的图形类型** | 类型 | 示例值 | 描述 | |---------------|--------------------------------------------|-----------------------| | Point | { "type": "Point", "coordinates": [lon, lat] } | 单点坐标 | | LineString | { "type": "LineString", "coordinates": [[lon1,lat1], [lon2,lat2]] } | 折线 | | Polygon | { "type": "Polygon", "coordinates": [ [[lon1,lat1], ...], [...] ] } | 多边形(需闭合) | | Envelope | { "type": "envelope", "coordinates": [[minLon, maxLat], [maxLon, minLat]] } | 矩形边界框 | 5. **查询方式** ```json GET /locations/_search { "query": { "geo_shape": { "location": { "shape": { "type": "polygon", "coordinates": [ /* 坐标数组 */ ] }, "relation": "intersects" // 空间关系 } } } } ``` 支持的关系类型: - `intersects`(默认):存在交集 - `contains`:完全包含 - `within`:完全被包含 6. **性能优化要点** - `tree`参数选择: - `quadtree`(四叉树):适合不规则分布数据 - `geohash`:适合均匀分布数据 - `precision`参数控制精度与存储的平衡 - `tree_levels`设置树的最大层级(默认自动计算) 7. **使用注意事项** - 坐标顺序必须为[经度, 纬度] - 多边形必须闭合(首末点相同) - 复杂图形建议拆分存储 - 默认使用WGS-84坐标系 - 索引性能与形状复杂度成反比 8. **典型查询示例** ```json // 判断点是否在区域内 GET /geo_index/_search { "query": { "geo_shape": { "area": { "shape": { "type": "point", "coordinates": [ 13.41, 52.52 ] }, "relation": "within" } } } } ``` 建议结合具体业务需求选择合适的分辨率和索引参数,对于高频查询场景,可以预先计算并存储常用区域的边界哈希值来优化性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值