docs/reference/elasticsearch/mapping-reference/geo-point.md
Fields of type geo_point accept latitude-longitude pairs, which can be used:
geo_shape query (for example, points in a polygon).geo_hash,
geo_tile or
geo_hex.geo_line.As with geo_shape and point, geo_point can be specified in GeoJSON
and Well-Known Text formats.
However, there are a number of additional formats that are supported for convenience and historical reasons.
In total there are six ways that a geopoint may be specified, as demonstrated below:
PUT my-index-000001
{
"mappings": {
"properties": {
"location": {
"type": "geo_point"
}
}
}
}
PUT my-index-000001/_doc/1
{
"text": "Geopoint as an object using GeoJSON format",
"location": { <1>
"type": "Point",
"coordinates": [-71.34, 41.12]
}
}
PUT my-index-000001/_doc/2
{
"text": "Geopoint as a WKT POINT primitive",
"location" : "POINT (-71.34 41.12)" <2>
}
PUT my-index-000001/_doc/3
{
"text": "Geopoint as an object with 'lat' and 'lon' keys",
"location": { <3>
"lat": 41.12,
"lon": -71.34
}
}
PUT my-index-000001/_doc/4
{
"text": "Geopoint as an array",
"location": [ -71.34, 41.12 ] <4>
}
PUT my-index-000001/_doc/5
{
"text": "Geopoint as a string",
"location": "41.12,-71.34" <5>
}
PUT my-index-000001/_doc/6
{
"text": "Geopoint as a geohash",
"location": "drm3btev3e86" <6>
}
GET my-index-000001/_search
{
"query": {
"geo_bounding_box": { <7>
"location": {
"top_left": {
"lat": 42,
"lon": -72
},
"bottom_right": {
"lat": 40,
"lon": -74
}
}
}
}
}
type and coordinates keys."POINT(lon lat)"lat and lon keys.lon, lat]"lat,lon".::::{admonition} Geopoints expressed as an array or string :class: important
Please note that string geopoints are ordered as lat,lon, while array
geopoints, GeoJSON and WKT are ordered as the reverse: lon,lat.
The reasons for this are historical. Geographers traditionally write latitude
before longitude, while recent formats specified for geographic data like
GeoJSON and Well-Known Text
order longitude before latitude (easting before northing) in order to match
the mathematical convention of ordering x before y.
::::
::::{note} A point can be expressed as a geohash. Geohashes are base32 encoded strings of the bits of the latitude and longitude interleaved. Each character in a geohash adds additional 5 bits to the precision. So the longer the hash, the more precise it is. For the indexing purposed geohashs are translated into latitude-longitude pairs. During this process only first 12 characters are used, so specifying more than 12 characters in a geohash doesn’t increase the precision. The 12 characters provide 60 bits, which should reduce a possible error to less than 2cm. ::::
geo_point fields [geo-point-params]The following parameters are accepted by geo_point fields:
ignore_malformed
: If true, malformed geopoints are ignored.
If false (default), malformed geopoints throw an exception and reject the whole document.
A geopoint is considered malformed if its latitude is outside the range -90 ⇐ latitude ⇐ 90,
or if its longitude is outside the range -180 ⇐ longitude ⇐ 180.
When set to true, if the format is valid, but the values are out of range,
the values will be normalized into the valid range, and the document will be indexed.
This is a special case, and a different behaviour from the normal for ignore_malformed.
Note that this cannot be set if the script parameter is used.
ignore_z_value
: If true (default) three dimension points will be accepted (stored in source)
but only latitude and longitude values will be indexed; the third dimension is
ignored. If false, geopoints containing any more than latitude and longitude
(two dimensions) values throw an exception and reject the whole document. Note
that this cannot be set if the script parameter is used.
index
: Should the field be quickly searchable? Accepts true (default) and
false. Fields that only have doc_values
enabled can still be queried, albeit slower.
null_value
: Accepts a geopoint value which is substituted for any explicit null values.
Defaults to null, which means the field is treated as missing. Note that this
cannot be set if the script parameter is used.
on_script_error
: Defines what to do if the script defined by the script parameter
throws an error at indexing time. Accepts fail (default), which
will cause the entire document to be rejected, and continue, which
will register the field in the document’s _ignored metadata field and continue
indexing. This parameter can only be set if the script field is
also set.
script
: If this parameter is set, then the field will index values generated
by this script, rather than reading the values directly from the
source. If a value is set for this field on the input document, then
the document will be rejected with an error.
Scripts are in the same format as their runtime equivalent, and should emit points
as a pair of (lat, lon) double values.
When accessing the value of a geopoint in a script, the value is returned as
a GeoPoint object, which allows access to the .lat and .lon values
respectively:
def geopoint = doc['location'].value;
def lat = geopoint.lat;
def lon = geopoint.lon;
For performance reasons, it is better to access the lat/lon values directly:
def lat = doc['location'].lat;
def lon = doc['location'].lon;
Synthetic source may sort geo_point fields (first by latitude and then
longitude) and reduces them to their stored precision. Additionally, unlike most
types, arrays of geo_point fields will not preserve order if
synthetic_source_keep is set to arrays. For example:
$$$synthetic-source-geo-point-example$$$
PUT idx
{
"settings": {
"index": {
"mapping": {
"source": {
"mode": "synthetic"
}
}
}
},
"mappings": {
"properties": {
"point": {
"type": "geo_point",
"synthetic_source_keep": "arrays"
}
}
}
}
PUT idx/_doc/1
{
"point": [
{"lat":10, "lon":30},
{"lat":-90, "lon":-80}
]
}
% TEST[s/$/\nGET idx/_doc/1?filter_path=_source\n/]
Will become:
{
"point": [
{"lat":-90.0, "lon":-80.00000000931323},
{"lat":9.999999990686774, "lon":29.999999972060323}
]
}
% TEST[s/^/{"_source":/ s/\n$/}/]