[[query-dsl-geohash-cell-query]]
=== Geohash Cell Query

The `geohash_cell` query provides access to a hierarchy of geohashes.
By defining a geohash cell, only <<mapping-geo-point-type,geopoints>>
within this cell will match this filter.

To get this filter work all prefixes of a geohash need to be indexed. In
example a geohash `u30` needs to be decomposed into three terms: `u30`,
`u3` and `u`. This decomposition must be enabled in the mapping of the
<<mapping-geo-point-type,geopoint>> field that's going to be filtered by
setting the `geohash_prefix` option:

[source,js]
--------------------------------------------------
{
    "mappings" : {
        "location": {
            "properties": {
                "pin": {
                    "type": "geo_point",
                    "geohash": true,
                    "geohash_prefix": true,
                    "geohash_precision": 10
                }
            }
        }
    }
}
--------------------------------------------------

The geohash cell can defined by all formats of `geo_points`. If such a cell is
defined by a latitude and longitude pair the size of the cell needs to be
setup. This can be done by the `precision` parameter of the filter. This
parameter can be set to an integer value which sets the length of the geohash
prefix. Instead of setting a geohash length directly it is also possible to
define the precision as distance, in example `"precision": "50m"`. (See
<<distance-units>>.)

The `neighbor` option of the filter offers the possibility to filter cells
next to the given cell.

[source,js]
--------------------------------------------------
{
    "filtered" : {
        "query" : {
            "match_all" : {}
        },
        "filter" : {
            "geohash_cell": {
                "pin": {
                    "lat": 13.4080,
                    "lon": 52.5186
                },
                "precision": 3,
                "neighbors": true
            }
        }
    }
}
--------------------------------------------------

