geo_shape查询

筛选使用geo_shape或geo_point类型索引的文档。

需要geo_shape映射或geo_point映射。

geo_shape查询使用与geo_shape映射相同的网格正方形表示来查找具有与查询形状相交的形状的文档。它还将使用与字段映射定义的相同的前缀树配置。

该查询支持两种定义查询形状的方法,一种是提供完整的形状定义,另一种是在另一个索引中引用预索引的形状名称。下面用示例定义了这两种格式。

内联的形状定义

与geo_shape类型类似,geo_shape查询使用GeoJSON来表示形状。

给定以下索引,其中位置为geo_shape字段:

PUT /example
{
  "mappings": {
    "properties": {
      "location": {
        "type": "geo_shape"
      }
    }
  }
}

POST /example/_doc?refresh
{
  "name": "Wind & Wetter, Berlin, Germany",
  "location": {
    "type": "point",
    "coordinates": [ 13.400544, 52.530286 ]
  }
}

下面的查询将使用Elasticsearch的envelope GeoJSON扩展查找该点:

GET /example/_search
{
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      },
      "filter": {
        "geo_shape": {
          "location": {
            "shape": {
              "type": "envelope",
              "coordinates": [ [ 13.0, 53.0 ], [ 14.0, 52.0 ] ]
            },
            "relation": "within"
          }
        }
      }
    }
  }
}

类似地,可以在geo_point字段上查询上述查询。

PUT /example_points
{
  "mappings": {
    "properties": {
      "location": {
        "type": "geo_point"
      }
    }
  }
}

PUT /example_points/_doc/1?refresh
{
  "name": "Wind & Wetter, Berlin, Germany",
  "location": [13.400544, 52.530286]
}

使用相同的查询,将返回具有匹配geo_point字段的文档。

GET /example_points/_search
{
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      },
      "filter": {
        "geo_shape": {
          "location": {
            "shape": {
              "type": "envelope",
              "coordinates": [ [ 13.0, 53.0 ], [ 14.0, 52.0 ] ]
            },
            "relation": "intersects"
          }
        }
      }
    }
  }
}
{
  "took" : 17,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "example_points",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "name": "Wind & Wetter, Berlin, Germany",
          "location": [13.400544, 52.530286]
        }
      }
    ]
  }
}

预先索引形状

该查询还支持使用已经在另一个索引中建立索引的形状。当您有一个预定义的形状列表,并且希望使用逻辑名称(例如New Zealand)引用该列表,而不是每次都必须提供坐标时,这一点特别有用。在这种情况下,只需要提供:

  • id - 包含预索引形状的文档的ID
  • index - 预索引形状所在的索引名称。默认的形状。
  • path - 指定为包含预索引形状的路径的字段。默认的形状。
  • routing - 如果需要,形状文档的路由。

下面是一个使用Filter和预索引形状的例子:

PUT /shapes
{
  "mappings": {
    "properties": {
      "location": {
        "type": "geo_shape"
      }
    }
  }
}

PUT /shapes/_doc/deu
{
  "location": {
    "type": "envelope",
    "coordinates" : [[13.0, 53.0], [14.0, 52.0]]
  }
}

GET /example/_search
{
  "query": {
    "bool": {
      "filter": {
        "geo_shape": {
          "location": {
            "indexed_shape": {
              "index": "shapes",
              "id": "deu",
              "path": "location"
            }
          }
        }
      }
    }
  }
}

 空间关系

geo_shape策略映射参数决定了在搜索时可以使用哪些空间关系算子。

以下是搜索地理位置字段时可用的空间关系操作符的完整列表:

  • INTERSECTS - (default) 返回其geo_shape或geo_point字段与查询几何图形相交的所有文档。
  • DISJOINT - 返回其geo_shape或geo_point字段与查询几何图形没有共同之处的所有文档。
  • WITHIN - 返回其geo_shape或geo_point字段在查询几何图形内的所有文档。不支持直线几何图形。
  • CONTAINS -返回其geo_shape或geo_point字段包含查询几何图形的所有文档。

忽略未映射的

备注

使用PrefixTrees实现的地理形状查询将不会执行搜索。Allow_expensive_queries设置为false。

当数据在geo_shape字段中作为一个形状数组进行索引时,这些数组被视为一个形状。由于这个原因,下面的请求是等价的。

PUT /test/_doc/1
{
  "location": [
    {
      "coordinates": [46.25,20.14],
      "type": "point"
    },
    {
      "coordinates": [47.49,19.04],
      "type": "point"
    }
  ]
}
PUT /test/_doc/1
{
  "location":
    {
      "coordinates": [[46.25,20.14],[47.49,19.04]],
      "type": "multipoint"
    }
}

 geo_shape查询假设geo_shape字段使用默认的右(逆时针)方向。See Polygon orientation.

<think>好的,我现在需要详细解释一下Elasticsearch中的geo_shape类型。首先,我得回忆一下自己之前学过的相关知识,确保准确无误。 首先,geo_shape是用来处理地理空间数据的,比如多边形、线、点这些形状。和geo_point的区别在于,geo_point只处理经纬度点,而geo_shape可以处理更复杂的形状。这可能涉及到空间关系,比如判断一个点是否在某个区域内,或者两个区域是否有交集。 接下来,数据类型方面,geo_shapeElasticsearch中是一种字段类型。用户定义映射时需要指定。例如,创建一个索引时,字段类型设置为geo_shape,可能还需要指定一些参数,比如精度或者使用的树结构,比如geohash或者quadtree。这里可能需要提到一些术语,比如prefix trees,比如Geohash是如何将地理数据编码成字符串的,quadtree又是如何分割空间的。 然后,关于空间关系,Elasticsearch支持哪些呢?比如INTERSECTS、DISJOINT、WITHIN、CONTAINS等。这些关系在查询时使用,比如查询某个形状与索引中的文档是否有交集。 索引和查询的过程需要解释。索引地理形状时,Elasticsearch会将其转换为相应的前缀树结构中的网格单元,这会影响查询的精度和性能。可能还需要提到一些参数,比如tree、precision、tree_levels等,这些参数如何影响索引的细节。 在查询时,用户需要使用geo_shape查询,指定形状的坐标和空间关系类型。例如,使用geo_shape查询来查找所有与某个多边形相交的文档。这里需要举一个具体的例子,比如定义一个多边形区域,然后构造查询语句,使用WKT(Well-Known Text)格式或者GeoJSON格式来表示形状。 另外,可能还要提到一些注意事项。比如性能问题,复杂的形状或者高精度的设置可能导致索引变大,查询变慢。还有精度和误差之间的权衡,如何调整参数来优化。同时,不同Elasticsearch版本之间可能有差异,需要确认支持的版本。 可能还需要比较一下geo_shapegeo_point的应用场景。例如,geo_point适合存储点数据,并进行距离计算或聚合,而geo_shape适合处理区域覆盖、形状相交等复杂空间关系。 最后,提供一些示例代码,比如如何创建映射,如何索引一个多边形,如何执行查询。这些示例需要确保语法正确,并且符合Elasticsearch的版本要求。例如,使用GeoJSON格式定义形状,或者在查询中使用envelope来指定一个矩形区域。 在整理这些信息时,要注意结构的清晰,分点说明,让用户能够逐步理解geo_shape的各个方面。同时,要检查是否有遗漏的重要点,比如支持的形状类型(点、线、多边形、多边形集合等),或者坐标系的注意事项(WGS84坐标系,经纬度顺序是经度在前,纬度在后)等。可能还要提到如何处理坐标数组,比如多边形需要闭合,即第一个点和最后一个点相同。 总结下来,需要涵盖定义、用途、数据类型结构、空间关系类型、索引和查询方法、参数配置、示例以及注意事项。确保每个部分都简明扼要,准确无误,并且用中文表达自然,不使用Markdown格式。</think>Elasticsearch 的 `geo_shape` 类型用于处理复杂地理空间数据(如多边形、线、点集合等),支持空间关系判断(如相交、包含等)。以下是详细说明: --- ### **1. 核心概念** - **与 geo_point 的区别** `geo_point` 仅存储单个经纬度点,适合坐标检索和距离计算; `geo_shape` 存储复杂形状(如区域边界),支持空间关系分析。 - **坐标系要求** 使用 **WGS-84** 坐标系(即标准 GPS 经纬度),坐标格式为 `[经度, 纬度]`。 --- ### **2. 数据结构** #### **索引映射定义** ```json PUT /my_index { "mappings": { "properties": { "location": { "type": "geo_shape", "tree": "quadtree", // 可选前缀树类型:quadtree 或 geohash "precision": "100m" // 控制精度,影响索引细节 } } } } ``` - **tree**: 空间索引算法(默认 `quadtree`)。 - **precision**: 精度越高,索引越细密,但资源消耗越大(如 `1km`、`10m`)。 --- ### **3. 支持的形状类型** - **Point**: 单点 `{ "type": "Point", "coordinates": [13.4, 52.5] }` - **LineString**: 线段 `{ "type": "LineString", "coordinates": [[13.4,52.5], [13.5,52.6]] }` - **Polygon**: 多边形(必须闭合) ```json { "type": "Polygon", "coordinates": [ [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ] ] } ``` - **MultiPolygon**: 多个多边形集合 - **Envelope**: 矩形(通过左上、右下两点定义) `{ "type": "envelope", "coordinates": [[100.0, 1.0], [101.0, 0.0]] }` --- ### **4. 空间关系查询** #### **主要关系类型** - **INTERSECTS** (默认): 形状有交集 - **DISJOINT**: 完全不相交 - **WITHIN**: 被目标形状包含 - **CONTAINS**: 包含目标形状 #### **查询示例** ```json GET /my_index/_search { "query": { "geo_shape": { "location": { "relation": "INTERSECTS", "shape": { "type": "Polygon", "coordinates": [ [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ] ] } } } } } ``` --- ### **5. 性能优化建议** - **精度调节**: 更高的 `precision` 提高准确性但增加计算量,需权衡场景需求。 - **简化形状**: 减少多边形顶点数量以降低复杂度。 - **预定义形状**: 对频繁查询的形状可预先存储,通过 `indexed_shape` 引用。 ```json "shape": { "indexed_shape": { "index": "shapes_library", "id": "berlin_boundary", "path": "location" } } ``` --- ### **6. 典型应用场景** - **地理围栏**: 判断设备点(`geo_point`)是否在某个区域内(`geo_shape`)。 - **区域叠加分析**: 查找与某规划区域相交的土地地块。 - **路径规划**: 分析道路(线)与禁行区域(多边形)的交叉情况。 --- ### **7. 注意事项** - **坐标顺序**: 始终为 `[经度, 纬度]`,写反会导致错误。 - **多边形闭合**: 首尾坐标点需相同。 - **版本兼容性**: 部分功能(如 `geo_shape` 查询语法)在较旧版本中可能不同。 - **性能监控**: 复杂查询可能影响集群性能,需结合 `_search/validate` 调试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值