2015-05-05 02:27:52 -04:00
[[query-dsl-geo-distance-query]]
2015-06-03 19:59:22 -04:00
=== Geo Distance Query
2013-08-28 19:24:34 -04:00
Filters documents that include only hits that exists within a specific
distance from a geo point. Assuming the following indexed json:
[source,js]
--------------------------------------------------
{
"pin" : {
"location" : {
"lat" : 40.12,
"lon" : -71.34
}
}
}
--------------------------------------------------
Then the following simple query can be executed with a `geo_distance`
filter:
[source,js]
--------------------------------------------------
{
"filtered" : {
"query" : {
"match_all" : {}
},
"filter" : {
"geo_distance" : {
"distance" : "200km",
"pin.location" : {
"lat" : 40,
"lon" : -70
}
}
}
}
2013-11-08 07:50:40 -05:00
}
2013-08-28 19:24:34 -04:00
--------------------------------------------------
[float]
2015-06-03 19:59:22 -04:00
==== Accepted Formats
2013-08-28 19:24:34 -04:00
In much the same way the `geo_point` type can accept different
representation of the geo point, the filter can accept it as well:
[float]
2015-06-03 19:59:22 -04:00
===== Lat Lon As Properties
2013-08-28 19:24:34 -04:00
[source,js]
--------------------------------------------------
{
"filtered" : {
"query" : {
"match_all" : {}
},
"filter" : {
"geo_distance" : {
"distance" : "12km",
"pin.location" : {
"lat" : 40,
"lon" : -70
}
}
}
}
}
--------------------------------------------------
[float]
2015-06-03 19:59:22 -04:00
===== Lat Lon As Array
2013-08-28 19:24:34 -04:00
Format in `[lon, lat]`, note, the order of lon/lat here in order to
conform with http://geojson.org/[GeoJSON].
[source,js]
--------------------------------------------------
{
"filtered" : {
"query" : {
"match_all" : {}
},
"filter" : {
"geo_distance" : {
"distance" : "12km",
2014-09-23 15:53:52 -04:00
"pin.location" : [-70, 40]
2013-08-28 19:24:34 -04:00
}
}
}
}
--------------------------------------------------
[float]
2015-06-03 19:59:22 -04:00
===== Lat Lon As String
2013-08-28 19:24:34 -04:00
Format in `lat,lon`.
[source,js]
--------------------------------------------------
{
"filtered" : {
"query" : {
"match_all" : {}
},
"filter" : {
"geo_distance" : {
"distance" : "12km",
"pin.location" : "40,-70"
}
}
}
}
--------------------------------------------------
[float]
2015-06-03 19:59:22 -04:00
===== Geohash
2013-08-28 19:24:34 -04:00
[source,js]
--------------------------------------------------
{
"filtered" : {
"query" : {
"match_all" : {}
},
"filter" : {
"geo_distance" : {
"distance" : "12km",
"pin.location" : "drm3btev3e86"
}
}
}
}
--------------------------------------------------
[float]
2015-06-03 19:59:22 -04:00
==== Options
2013-08-28 19:24:34 -04:00
The following are options allowed on the filter:
2013-11-08 07:50:40 -05:00
[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`::
2015-05-05 04:03:15 -04:00
How to compute the distance. Can either be `sloppy_arc` (default), `arc` (slightly more precise but significantly slower) or `plane` (faster, but inaccurate on long distances and close to the poles).
2013-11-08 07:50:40 -05:00
`optimize_bbox`::
Whether to use the optimization of first running a bounding box check
before the distance check. Defaults to `memory` which will do in memory
checks. Can also have values of `indexed` to use indexed value check (make
sure the `geo_point` type index lat lon in this case), or `none` which
disables bounding box optimization.
2015-08-07 16:55:22 -04:00
`_name`::
Optional name field to identify the query
`coerce`::
Set to `true` to normalize longitude and latitude values to a standard -180:180 / -90:90
coordinate system. (default is `false`).
`ignore_malformed`::
Set to `true` to accept geo points with invalid latitude or
longitude (default is `false`).
2013-08-28 19:24:34 -04:00
[float]
2015-06-03 19:59:22 -04:00
==== geo_point Type
2013-08-28 19:24:34 -04:00
The filter *requires* the `geo_point` type to be set on the relevant
field.
[float]
2015-06-03 19:59:22 -04:00
==== Multi Location Per Document
2013-08-28 19:24:34 -04:00
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.