| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249 | [[query-dsl-geo-bounding-box-query]]=== Geo Bounding Box QueryA query allowing to filter hits based on a point location using abounding box. Assuming the following indexed document:[source,js]--------------------------------------------------{    "pin" : {        "location" : {            "lat" : 40.12,            "lon" : -71.34        }    }}--------------------------------------------------Then the following simple query can be executed with a`geo_bounding_box` filter:[source,js]--------------------------------------------------{    "bool" : {        "must" : {            "match_all" : {}        },        "filter" : {            "geo_bounding_box" : {                "pin.location" : {                    "top_left" : {                        "lat" : 40.73,                        "lon" : -74.1                    },                    "bottom_right" : {                        "lat" : 40.01,                        "lon" : -71.12                    }                }            }        }    }}--------------------------------------------------[float]==== Query Options[cols="<,<",options="header",]|=======================================================================|Option |Description|`_name` |Optional name field to identify the filter|`ignore_malformed` |Set to `true` toaccept geo points with invalid latitude or longitude (default is `false`).|`type` |Set to one of `indexed` or `memory` to defines whether this filter willbe executed in memory or indexed. See <<geo-bbox-type,Type>> below for further detailsDefault is `memory`.|=======================================================================[float]==== Accepted FormatsIn much the same way the geo_point type can accept differentrepresentation of the geo point, the filter can accept it as well:[float]===== Lat Lon As Properties[source,js]--------------------------------------------------{    "bool" : {        "must" : {            "match_all" : {}        },        "filter" : {            "geo_bounding_box" : {                "pin.location" : {                    "top_left" : {                        "lat" : 40.73,                        "lon" : -74.1                    },                    "bottom_right" : {                        "lat" : 40.01,                        "lon" : -71.12                    }                }            }        }    }}--------------------------------------------------[float]===== Lat Lon As ArrayFormat in `[lon, lat]`, note, the order of lon/lat here in order toconform with http://geojson.org/[GeoJSON].[source,js]--------------------------------------------------{    "bool" : {        "must" : {            "match_all" : {}        },        "filter" : {            "geo_bounding_box" : {                "pin.location" : {                    "top_left" : [-74.1, 40.73],                    "bottom_right" : [-71.12, 40.01]                }            }        }    }}--------------------------------------------------[float]===== Lat Lon As StringFormat in `lat,lon`.[source,js]--------------------------------------------------{    "bool" : {        "must" : {            "match_all" : {}        },        "filter" : {            "geo_bounding_box" : {                "pin.location" : {                    "top_left" : "40.73, -74.1",                    "bottom_right" : "40.01, -71.12"                }            }        }    }}--------------------------------------------------[float]===== Geohash[source,js]--------------------------------------------------{    "bool" : {        "must" : {            "match_all" : {}        },        "filter" : {            "geo_bounding_box" : {                "pin.location" : {                    "top_left" : "dr5r9ydj2y73",                    "bottom_right" : "drj7teegpus6"                }            }        }    }}--------------------------------------------------[float]==== VerticesThe vertices of the bounding box can either be set by `top_left` and`bottom_right` or by `top_right` and `bottom_left` parameters. Moreover the names `topLeft`, `bottomRight`, `topRight` and `bottomLeft`are supported. Instead of setting the values pairwise, one can usethe simple names `top`, `left`, `bottom` and `right` to set thevalues separately.[source,js]--------------------------------------------------{    "bool" : {        "must" : {            "match_all" : {}        },        "filter" : {            "geo_bounding_box" : {                "pin.location" : {                    "top" : 40.73,                    "left" : -74.1,                    "bottom" : 40.01,                    "right" : -71.12                }            }        }    }}--------------------------------------------------[float]==== geo_point TypeThe filter *requires* the `geo_point` type to be set on the relevantfield.[float]==== Multi Location Per DocumentThe filter can work with multiple locations / points per document. Oncea single location / point matches the filter, the document will beincluded in the filter[float][[geo-bbox-type]]==== TypeThe type of the bounding box execution by default is set to `memory`,which means in memory checks if the doc falls within the bounding boxrange. In some cases, an `indexed` option will perform faster (but notethat the `geo_point` type must have lat and lon indexed in this case).Note, when using the indexed option, multi locations per document fieldare not supported. Here is an example:[source,js]--------------------------------------------------{    "bool" : {        "must" : {            "match_all" : {}        },        "filter" : {            "geo_bounding_box" : {                "pin.location" : {                    "top_left" : {                        "lat" : 40.73,                        "lon" : -74.1                    },                    "bottom_right" : {                        "lat" : 40.10,                        "lon" : -71.12                    }                },                "type" : "indexed"            }        }    }}--------------------------------------------------
 |