WARNING: The 2.x versions of Elasticsearch have passed their EOL dates. If you are running a 2.x version, we strongly advise you to upgrade.
This documentation is no longer maintained and may be removed. For the latest information, see the current Elasticsearch documentation.
Geo Distance Filteredit
The geo_distance filter draws a circle around the specified location and
finds all documents that have a geo-point within that circle:
GET /attractions/restaurant/_search
{
"query": {
"filtered": {
"filter": {
"geo_distance": {
"distance": "1km",
"location": {
"lat": 40.715,
"lon": -73.988
}
}
}
}
}
}
|
Find all |
|
|
The central point can be specified as a string, an array, or (as in this example) an object. See Lat/Lon Formats. |
A geo-distance calculation is expensive. To optimize performance, Elasticsearch draws a box around the circle and first uses the less expensive bounding-box calculation to exclude as many documents as it can. It runs the geo-distance calculation on only those points that fall within the bounding box.
Do your users really require an accurate circular filter to be applied to their results? Using a rectangular bounding box is much more efficient than geo-distance and will usually serve their purposes just as well.
Faster Geo-Distance Calculationsedit
The distance between two points can be calculated using algorithms, which trade performance for accuracy:
-
arc -
The slowest but most accurate is the
arccalculation, which treats the world as a sphere. Accuracy is still limited because the world isn’t really a sphere. -
plane -
The
planecalculation, which treats the world as if it were flat, is faster but less accurate. It is most accurate at the equator and becomes less accurate toward the poles. -
sloppy_arc -
So called because it uses the
SloppyMathLucene class to trade accuracy for speed, thesloppy_arccalculation uses the Haversine formula to calculate distance. It is four to five times as fast asarc, and distances are 99.9% accurate. This is the default calculation.
You can specify a different calculation as follows:
GET /attractions/restaurant/_search
{
"query": {
"filtered": {
"filter": {
"geo_distance": {
"distance": "1km",
"distance_type": "plane",
"location": {
"lat": 40.715,
"lon": -73.988
}
}
}
}
}
}
Will your users really care if a restaurant is a few meters outside their specified radius? While some geo applications require great accuracy, less-accurate but faster calculations will suit the majority of use cases just fine.
geo_distance_range Filteredit
The only difference between the geo_distance and geo_distance_range
filters is that the latter has a doughnut shape and excludes documents within
the central hole.
Instead of specifying a single distance from the center, you specify a
minimum distance (with gt or gte) and maximum distance (with lt or
lte), just like a range filter: