123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309 |
- [[query-dsl-geo-bounding-box-query]]
- === Geo Bounding Box Query
- A query allowing to filter hits based on a point location using a
- bounding box. Assuming the following indexed document:
- [source,js]
- --------------------------------------------------
- PUT /my_locations
- {
- "mappings": {
- "location": {
- "properties": {
- "pin": {
- "properties": {
- "location": {
- "type": "geo_point"
- }
- }
- }
- }
- }
- }
- }
- PUT /my_locations/location/1
- {
- "pin" : {
- "location" : {
- "lat" : 40.12,
- "lon" : -71.34
- }
- }
- }
- --------------------------------------------------
- // CONSOLE
- // TESTSETUP
- Then the following simple query can be executed with a
- `geo_bounding_box` filter:
- [source,js]
- --------------------------------------------------
- GET /_search
- {
- "query": {
- "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
- }
- }
- }
- }
- }
- }
- }
- --------------------------------------------------
- // CONSOLE
- [float]
- ==== Query Options
- [cols="<,<",options="header",]
- |=======================================================================
- |Option |Description
- |`_name` |Optional name field to identify the filter
- |`ignore_malformed` |deprecated[5.0.0,Use `validation_method` instead] Set to `true` to
- accept geo points with invalid latitude or longitude (default is `false`).
- |`validation_method` |Set to `IGNORE_MALFORMED` to
- accept geo points with invalid latitude or longitude, set to
- `COERCE` to also try to infer correct latitude or longitude. (default is `STRICT`).
- |`type` |Set to one of `indexed` or `memory` to defines whether this filter will
- be executed in memory or indexed. See <<geo-bbox-type,Type>> below for further details
- Default is `memory`.
- |=======================================================================
- [float]
- ==== Accepted Formats
- In much the same way the geo_point type can accept different
- representation of the geo point, the filter can accept it as well:
- [float]
- ===== Lat Lon As Properties
- [source,js]
- --------------------------------------------------
- GET /_search
- {
- "query": {
- "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
- }
- }
- }
- }
- }
- }
- }
- --------------------------------------------------
- // CONSOLE
- [float]
- ===== Lat Lon As Array
- Format in `[lon, lat]`, note, the order of lon/lat here in order to
- conform with http://geojson.org/[GeoJSON].
- [source,js]
- --------------------------------------------------
- GET /_search
- {
- "query": {
- "bool" : {
- "must" : {
- "match_all" : {}
- },
- "filter" : {
- "geo_bounding_box" : {
- "pin.location" : {
- "top_left" : [-74.1, 40.73],
- "bottom_right" : [-71.12, 40.01]
- }
- }
- }
- }
- }
- }
- --------------------------------------------------
- // CONSOLE
- [float]
- ===== Lat Lon As String
- Format in `lat,lon`.
- [source,js]
- --------------------------------------------------
- GET /_search
- {
- "query": {
- "bool" : {
- "must" : {
- "match_all" : {}
- },
- "filter" : {
- "geo_bounding_box" : {
- "pin.location" : {
- "top_left" : "40.73, -74.1",
- "bottom_right" : "40.01, -71.12"
- }
- }
- }
- }
- }
- }
- --------------------------------------------------
- // CONSOLE
- [float]
- ===== Geohash
- [source,js]
- --------------------------------------------------
- GET /_search
- {
- "query": {
- "bool" : {
- "must" : {
- "match_all" : {}
- },
- "filter" : {
- "geo_bounding_box" : {
- "pin.location" : {
- "top_left" : "dr5r9ydj2y73",
- "bottom_right" : "drj7teegpus6"
- }
- }
- }
- }
- }
- }
- --------------------------------------------------
- // CONSOLE
- [float]
- ==== Vertices
- The vertices of the bounding box can either be set by `top_left` and
- `bottom_right` or by `top_right` and `bottom_left` parameters. More
- over the names `topLeft`, `bottomRight`, `topRight` and `bottomLeft`
- are supported. Instead of setting the values pairwise, one can use
- the simple names `top`, `left`, `bottom` and `right` to set the
- values separately.
- [source,js]
- --------------------------------------------------
- GET /_search
- {
- "query": {
- "bool" : {
- "must" : {
- "match_all" : {}
- },
- "filter" : {
- "geo_bounding_box" : {
- "pin.location" : {
- "top" : 40.73,
- "left" : -74.1,
- "bottom" : 40.01,
- "right" : -71.12
- }
- }
- }
- }
- }
- }
- --------------------------------------------------
- // CONSOLE
- [float]
- ==== geo_point Type
- The filter *requires* the `geo_point` type to be set on the relevant
- field.
- [float]
- ==== Multi Location Per Document
- The filter can work with multiple locations / points per document. Once
- a single location / point matches the filter, the document will be
- included in the filter
- [float]
- [[geo-bbox-type]]
- ==== Type
- The type of the bounding box execution by default is set to `memory`,
- which means in memory checks if the doc falls within the bounding box
- range. In some cases, an `indexed` option will perform faster (but note
- that the `geo_point` type must have lat and lon indexed in this case).
- Note, when using the indexed option, multi locations per document field
- are not supported. Here is an example:
- [source,js]
- --------------------------------------------------
- GET /_search
- {
- "query": {
- "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"
- }
- }
- }
- }
- }
- --------------------------------------------------
- // CONSOLE
- [float]
- ==== Ignore Unmapped
- When set to `true` the `ignore_unmapped` option will ignore an unmapped field
- and will not match any documents for this query. This can be useful when
- querying multiple indexes which might have different mappings. When set to
- `false` (the default value) the query will throw an exception if the field
- is not mapped.
|