Filter and sort search results based on their geographic location.
Meilisearch allows you to filter and sort results based on their geographic location. This can be useful when you only want results within a specific area or when sorting results based on their distance from a specific location.
Due to Meilisearch allowing malformed _geo fields in the following versions (v0.27, v0.28 and v0.29), please ensure the _geo field follows the correct format.
To start filtering documents based on their geographic location, you must make sure they contain a valid _geo or _geojson field. If you also want to sort documents geogeraphically, they must have a valid _geo field._geo and _geojson are reserved fields. If you include one of them in your documents, Meilisearch expects its value to conform to a specific format.When using JSON and NDJSON, _geo must contain an object with two keys: lat and lng. Both fields must contain either a floating point number or a string indicating, respectively, latitude and longitude:
Meilisearch does not support transmeridian shapes. If your document includes a transmeridian shape, split it into two separate shapes grouped as a MultiPolygon or MultiLine. Transmeridian shapes are polygons or lines that cross the 180th meridian.Meilisearch does not support polygons with holes. If your polygon consists of an external ring and an inner empty space, Meilisearch ignores the hole and treats the polygon as a solid shape.
If your application requires both sorting by distance to a point and filtering by shapes other than a circle or a rectangle, you will need to add both _geo and _geojson to your documents.When handling documents with both fields, Meilisearch:
Ignores _geojson values when sorting
Ignores _geo values when filtering with _geoPolygon
Matches both _geo and _geojson values when filtering with _geoRadius and _geoBoundingBox
Trying to index a dataset with one or more documents containing badly formatted _geo values will cause Meilisearch to throw an invalid_document_geo_field error. In this case, the update will fail and no documents will be added or modified.
If your dataset is formatted as CSV, the file header must have a _geo column. Each row in the dataset must then contain a column with a comma-separated string indicating latitude and longitude:
Use the filter search parameter along with _geoRadius and _geoBoundingBox. These are special filter rules that ensure Meilisearch only returns results located within a specific geographic area. If you are using GeoJSON for your documents, you may also filter results with _geoPolygon.
It is also possible to combine _geoRadius, _geoBoundingBox, and _geoPolygon with other filters. We can narrow down our previous search so it only includes pizzerias:
Copy
curl \ -X POST 'MEILISEARCH_URL/indexes/restaurants/search' \ -H 'Content-type:application/json' \ --data-binary '{ "filter": "_geoRadius(45.472735, 9.184019, 2000) AND type = pizza" }'
_geo, _geoDistance, and _geoPoint are not valid filter rules. Trying to use any of them with the filter search parameter will result in an invalid_search_filter error.
_geoPoint also works when used together with other sorting rules. We can sort restaurants based on their proximity to the Eiffel Tower and their rating: