# Geosearch
Typesense supports geo search on fields containing latitude and longitude values, specified as the geopoint
or geopoint[]
field types.
Let's create a collection called places
with a field called location
of type geopoint
.
Let's now index a document.
NOTE
Make sure to set the coordinates in the correct order: [Latitude, Longitude]
. GeoJSON often uses [Longitude, Latitude]
which is invalid!
# Searching within a Radius
We can now search for places within a given radius of a given latlong
(use mi
for miles and km
for kilometers) using the filter_by
search parameter.
In addition, let's also sort the records that are closest to a given location (this location can be the same or different from the latlong used for filtering).
Sample Response
The above example uses "5.1 km" as the radius, but you can also use miles, e.g.
location:(48.90615915923891, 2.3435897727061175, 2 mi)
.
# Searching Within a Geo Polygon
You can also filter for documents within any arbitrary shaped polygon.
You want to specify the geo-points of the polygon as lat, lng pairs.
'filter_by' : 'location:(48.8662, 2.3255, 48.8581, 2.3209, 48.8561, 2.3448, 48.8641, 2.3469)'
# Sorting by Additional Attributes within a Radius
# exclude_radius
Sometimes, it's useful to sort nearby places within a radius based on another attribute like popularity
, and then sort by distance outside this radius.
You can use the exclude_radius
option for that.
'sort_by' : 'location(48.853, 2.344, exclude_radius: 2mi):asc, popularity:desc'
This makes all documents within a 2 mile radius to "tie" with the same value for distance.
To break the tie, these records will be sorted by the next field in the list popularity:desc
.
Records outside the 2 mile radius are sorted first on their distance and then on popularity:desc
as usual.
# precision
Similarly, you can bucket all geo points into "groups" using the precision
parameter, so that all results within this group will have the same "geo distance score".
'sort_by' : 'location(48.853, 2.344, precision: 2mi):asc, popularity:desc'
This will bucket the results into 2-mile groups and force records within each bucket into a tie for "geo score", so that the popularity metric can be used to tie-break and sort results within each bucket.