mirror of
https://github.com/elastic/elasticsearch.git
synced 2025-04-25 07:37:19 -04:00
296 lines
5.8 KiB
Text
296 lines
5.8 KiB
Text
[[query-dsl-geo-distance-query]]
|
|
=== Geo-distance query
|
|
++++
|
|
<titleabbrev>Geo-distance</titleabbrev>
|
|
++++
|
|
|
|
Matches <<geo-point,`geo_point`>> and <<geo-shape,`geo_shape`>> values within
|
|
a given distance of a geopoint.
|
|
|
|
[discrete]
|
|
[[geo-distance-query-ex]]
|
|
==== Example
|
|
|
|
Assume the following documents are indexed:
|
|
|
|
[source,console]
|
|
--------------------------------------------------
|
|
PUT /my_locations
|
|
{
|
|
"mappings": {
|
|
"properties": {
|
|
"pin": {
|
|
"properties": {
|
|
"location": {
|
|
"type": "geo_point"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
PUT /my_locations/_doc/1
|
|
{
|
|
"pin": {
|
|
"location": {
|
|
"lat": 40.12,
|
|
"lon": -71.34
|
|
}
|
|
}
|
|
}
|
|
|
|
PUT /my_geoshapes
|
|
{
|
|
"mappings": {
|
|
"properties": {
|
|
"pin": {
|
|
"properties": {
|
|
"location": {
|
|
"type": "geo_shape"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
PUT /my_geoshapes/_doc/1
|
|
{
|
|
"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]]]
|
|
}
|
|
}
|
|
}
|
|
--------------------------------------------------
|
|
// TESTSETUP
|
|
|
|
|
|
Use a `geo_distance` filter to match `geo_point` values within a specified
|
|
distance of another geopoint:
|
|
|
|
[source,console]
|
|
--------------------------------------------------
|
|
GET /my_locations/_search
|
|
{
|
|
"query": {
|
|
"bool": {
|
|
"must": {
|
|
"match_all": {}
|
|
},
|
|
"filter": {
|
|
"geo_distance": {
|
|
"distance": "200km",
|
|
"pin.location": {
|
|
"lat": 40,
|
|
"lon": -70
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
--------------------------------------------------
|
|
|
|
Use the same filter to match `geo_shape` values within the given distance:
|
|
|
|
[source,console]
|
|
--------------------------------------------------
|
|
GET my_geoshapes/_search
|
|
{
|
|
"query": {
|
|
"bool": {
|
|
"must": {
|
|
"match_all": {}
|
|
},
|
|
"filter": {
|
|
"geo_distance": {
|
|
"distance": "200km",
|
|
"pin.location": {
|
|
"lat": 40,
|
|
"lon": -70
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
--------------------------------------------------
|
|
|
|
To match both `geo_point` and `geo_shape` values, search both indices:
|
|
|
|
[source,console]
|
|
--------------------------------------------------
|
|
GET my_locations,my_geoshapes/_search
|
|
{
|
|
"query": {
|
|
"bool": {
|
|
"must": {
|
|
"match_all": {}
|
|
},
|
|
"filter": {
|
|
"geo_distance": {
|
|
"distance": "200km",
|
|
"pin.location": {
|
|
"lat": 40,
|
|
"lon": -70
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
--------------------------------------------------
|
|
|
|
|
|
[discrete]
|
|
==== Accepted formats
|
|
|
|
In much the same way the `geo_point` type can accept different
|
|
representations of the geo point, the filter can accept it as well:
|
|
|
|
[discrete]
|
|
===== Lat lon as properties
|
|
|
|
[source,console]
|
|
--------------------------------------------------
|
|
GET /my_locations/_search
|
|
{
|
|
"query": {
|
|
"bool": {
|
|
"must": {
|
|
"match_all": {}
|
|
},
|
|
"filter": {
|
|
"geo_distance": {
|
|
"distance": "12km",
|
|
"pin.location": {
|
|
"lat": 40,
|
|
"lon": -70
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
--------------------------------------------------
|
|
|
|
[discrete]
|
|
===== Lat lon as array
|
|
|
|
Format in `[lon, lat]`, note, the order of lon/lat here in order to
|
|
conform with http://geojson.org/[GeoJSON].
|
|
|
|
[source,console]
|
|
--------------------------------------------------
|
|
GET /my_locations/_search
|
|
{
|
|
"query": {
|
|
"bool": {
|
|
"must": {
|
|
"match_all": {}
|
|
},
|
|
"filter": {
|
|
"geo_distance": {
|
|
"distance": "12km",
|
|
"pin.location": [ -70, 40 ]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
--------------------------------------------------
|
|
|
|
|
|
[discrete]
|
|
===== Lat lon as WKT string
|
|
|
|
Format in https://docs.opengeospatial.org/is/12-063r5/12-063r5.html[Well-Known Text].
|
|
|
|
[source,console]
|
|
--------------------------------------------------
|
|
GET /my_locations/_search
|
|
{
|
|
"query": {
|
|
"bool": {
|
|
"must": {
|
|
"match_all": {}
|
|
},
|
|
"filter": {
|
|
"geo_distance": {
|
|
"distance": "12km",
|
|
"pin.location": "POINT (-70 40)"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
--------------------------------------------------
|
|
|
|
[discrete]
|
|
===== Geohash
|
|
|
|
[source,console]
|
|
--------------------------------------------------
|
|
GET /my_locations/_search
|
|
{
|
|
"query": {
|
|
"bool": {
|
|
"must": {
|
|
"match_all": {}
|
|
},
|
|
"filter": {
|
|
"geo_distance": {
|
|
"distance": "12km",
|
|
"pin.location": "drm3btev3e86"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
--------------------------------------------------
|
|
|
|
[discrete]
|
|
==== Options
|
|
|
|
The following are options allowed on the filter:
|
|
|
|
[horizontal]
|
|
|
|
`distance`::
|
|
|
|
The radius of the circle centred on the specified location. Points which
|
|
fall into this circle are considered to be matches. The `distance` can be
|
|
specified in various units. See <<distance-units>>.
|
|
|
|
`distance_type`::
|
|
|
|
How to compute the distance. Can either be `arc` (default), or `plane` (faster, but inaccurate on long distances and close to the poles).
|
|
|
|
`_name`::
|
|
|
|
Optional name field to identify the query
|
|
|
|
`validation_method`::
|
|
|
|
Set to `IGNORE_MALFORMED` to accept geo points with invalid latitude or
|
|
longitude, set to `COERCE` to additionally try and infer correct
|
|
coordinates (default is `STRICT`).
|
|
|
|
[discrete]
|
|
==== Multi location per document
|
|
|
|
The `geo_distance` filter can work with multiple locations / points per
|
|
document. Once a single location / point matches the filter, the
|
|
document will be included in the filter.
|
|
|
|
[discrete]
|
|
==== Ignore unmapped
|
|
|
|
When set to `true` the `ignore_unmapped` option will ignore an unmapped field
|
|
and will not match any documents for this query. This can be useful when
|
|
querying multiple indexes which might have different mappings. When set to
|
|
`false` (the default value) the query will throw an exception if the field
|
|
is not mapped.
|