ElasticSearch Query DSL(四)

ElasticSearch Query DSL(四)

地理查询

地理距离查询

查找与中心点的指定距离内具有地理点的文档。一个地理位置点方圆几公里内的所有文档。

例子

假设以下文档被索引:

curl -X PUT "localhost:9200/my_locations?pretty" -H 'Content-Type: application/json' -d'
{
  "mappings": {
    "properties": {
      "pin": {
        "properties": {
          "location": {
            "type": "geo_point"
          }
        }
      }
    }
  }
}
'
curl -X PUT "localhost:9200/my_locations/_doc/1?pretty" -H 'Content-Type: application/json' -d'
{
  "pin": {
    "location": {
      "lat": 40.12,
      "lon": -71.34
    }
  }
}
'
curl -X PUT "localhost:9200/my_geoshapes?pretty" -H 'Content-Type: application/json' -d'
{
  "mappings": {
    "properties": {
      "pin": {
        "properties": {
          "location": {
            "type": "geo_shape"
          }
        }
      }
    }
  }
}
'
curl -X PUT "localhost:9200/my_geoshapes/_doc/1?pretty" -H 'Content-Type: application/json' -d'
{
  "pin": {
    "location": {
      "type" : "polygon",
      "coordinates" : [[[13.0 ,51.5], [15.0, 51.5], [15.0, 54.0], [13.0, 54.0], [13.0 ,51.5]]]
    }
  }
}
'

使用geo_distance过滤器来匹配一个地理点到指定距离内的geo_point值。

curl -X GET "localhost:9200/my_locations/_search?pretty" -H 'Content-Type: application/json' -d'
{
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      },
      "filter": {
        "geo_distance": {
          "distance": "200km",
          "pin.location": {
            "lat": 40,
            "lon": -70
          }
        }
      }
    }
  }
}
'

使用相同的过滤器来匹配给定距离内的 geo_shape 值:

curl -X GET "localhost:9200/my_geoshapes/_search?pretty" -H 'Content-Type: application/json' -d'
{
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      },
      "filter": {
        "geo_distance": {
          "distance": "200km",
          "pin.location": {
            "lat": 40,
            "lon": -70
          }
        }
      }
    }
  }
}
'

要匹配 geo_point 和 geo_shape 值,请搜索两个索引:

curl -X GET "localhost:9200/my_locations,my_geoshapes/_search?pretty" -H 'Content-Type: application/json' -d'
{
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      },
      "filter": {
        "geo_distance": {
          "distance": "200km",
          "pin.location": {
            "lat": 40,
            "lon": -70
          }
        }
      }
    }
  }
}
'

形状查询

查询包含shape类型字段索引的文档。

需要shape映射

查询支持两种方式,第一种是提供完整的形状定义,第二种是引用另一个索引中预先索引的形状名称或者id。下边是这两种方式的定义:

内联形状定义

geo_shape查询类似,shape查询使用GeoJSON或者WKT来表示形状。

给定以下索引:

curl -X PUT "localhost:9200/example?pretty" -H 'Content-Type: application/json' -d'
{
  "mappings": {
    "properties": {
      "geometry": {
        "type": "shape"
      }
    }
  }
}
'
curl -X PUT "localhost:9200/example/_doc/1?refresh=wait_for&pretty" -H 'Content-Type: application/json' -d'
{
  "name": "Lucky Landing",
  "geometry": {
    "type": "point",
    "coordinates": [ 1355.400544, 5255.530286 ]
  }
}
'

以下查询将使用ElasticSearch的GeoJSON envelope 扩展找到该点:

curl -X GET "localhost:9200/example/_search?pretty" -H 'Content-Type: application/json' -d'
{
  "query": {
    "shape": {
      "geometry": {
        "shape": {
          "type": "envelope",
          "coordinates": [ [ 1355.0, 5355.0 ], [ 1400.0, 5200.0 ] ]
        },
        "relation": "within"
      }
    }
  }
}
'

预索引形状

该查询也支持使用在其他索引中已经被索引的形状。当您有一个预定义的形状列表,并且对您的应用程序非常有用,并且您希望使用一个逻辑名称(例如New Zealand)来引用它,而不是每次都必须提供它们的坐标时,这特别有用。在这种情况下,只需提供:

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

以下是使用具有预索引形状的过滤器的示例:

curl -X PUT "localhost:9200/shapes?pretty" -H 'Content-Type: application/json' -d'
{
  "mappings": {
    "properties": {
      "geometry": {
        "type": "shape"
      }
    }
  }
}
'
curl -X PUT "localhost:9200/shapes/_doc/footprint?pretty" -H 'Content-Type: application/json' -d'
{
  "geometry": {
    "type": "envelope",
    "coordinates": [ [ 1355.0, 5355.0 ], [ 1400.0, 5200.0 ] ]
  }
}
'
curl -X GET "localhost:9200/example/_search?pretty" -H 'Content-Type: application/json' -d'
{
  "query": {
    "shape": {
      "geometry": {
        "indexed_shape": {
          "index": "shapes",
          "id": "footprint",
          "path": "geometry"
        }
      }
    }
  }
}
'

空间关系

以下是可用空间关系运算符的完整列表:

  • INTERSECTS-(默认)返回shape字段与查询几何图形相交的所有文档。
  • DISJOINT- 返回其shape字段与查询几何没有共同之处的所有文档。
  • WITHIN- 返回其shape字段在查询几何范围内的所有文档。
  • CONTAINS- 返回其shape字段包含查询几何的所有文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值