lat_lon

Geo-queries are usually performed by plugging the value of each geo_point field into a formula to determine whether it falls into the required area or not. Unlike most queries, the inverted index is not involved.

Setting lat_lon to true causes the latitude and longitude values to be indexed as numeric fields (called .lat and .lon). These fields can be used by the geo_bounding_box and geo_distance queries instead of performing in-memory calculations.

PUT my_index
{
  "mappings": {
    "my_type": {
      "properties": {
        "location": {
          "type": "geo_point",
          "lat_lon": true 
        }
      }
    }
  }
}

PUT my_index/my_type/1
{
  "location": {
    "lat": 41.12,
    "lon": -71.34
  }
}


GET my_index/_search
{
  "query": {
    "geo_distance": {
      "location": {
        "lat": 41,
        "lon": -71
      },
      "distance": "50km",
      "optimize_bbox": "indexed" 
    }
  }
}

Setting lat_lon to true indexes the geo-point in the location.lat and location.lon fields.

The indexed option tells the geo-distance query to use the inverted index instead of the in-memory calculation.

Whether the in-memory or indexed operation performs better depends both on your dataset and on the types of queries that you are running.

The lat_lon option only makes sense for single-value geo_point fields. It will not work with arrays of geo-points.