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", (1)
"location": { (2)
"lat": 40.715,
"lon": -73.988
}
}
}
}
}
}
Find all location
fields within 1km
of the specified point.
See {ref}/common-options.html#distance-units[Distance Units] for
a list of the accepted units.
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.
Tip
|
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. |
The distance between two points can be calculated using algorithms, which trade performance for accuracy:
arc
The slowest but most accurate is the arc
calculation, which treats the world
as a sphere. Accuracy is still limited because the world isn’t really a sphere.
plane
The plane
calculation, 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 SloppyMath
Lucene class to trade accuracy for speed,
the sloppy_arc
calculation uses the
Haversine formula to calculate
distance. It is four to five times as fast as arc
, 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", (1)
"location": {
"lat": 40.715,
"lon": -73.988
}
}
}
}
}
}
Use the faster but less accurate plane
calculation.
Tip
|
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. |
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:
GET /attractions/restaurant/_search
{
"query": {
"filtered": {
"filter": {
"geo_distance_range": {
"gte": "1km", (1)
"lt": "2km", (1)
"location": {
"lat": 40.715,
"lon": -73.988
}
}
}
}
}
}
Matches locations that are at least 1km
from the center, and less than
2km
from the center.
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。