Geo-grid query
Matches geo_point and geo_shape values that intersect a grid cell from a GeoGrid aggregation.
The query is designed to match the documents that fall inside a bucket of a geogrid aggregation by providing the key of the bucket. For geohash and geotile grids, the query can be used for geo_point and geo_shape fields. For geo_hex grid, it can only be used for geo_point fields.
Assume the following the following documents are indexed:
PUT /my_locations{ "mappings": { "properties": { "location": { "type": "geo_point" } } } }PUT /my_locations/_doc/1?refresh{ "location" : "POINT(4.912350 52.374081)", "city": "Amsterdam", "name": "NEMO Science Museum" }PUT /my_locations/_doc/2?refresh{ "location" : "POINT(4.405200 51.222900)", "city": "Antwerp", "name": "Letterenhuis" }PUT /my_locations/_doc/3?refresh{ "location" : "POINT(2.336389 48.861111)", "city": "Paris", "name": "Musée du Louvre" }
Using a geohash_grid aggregation, it is possible to group documents depending on their geohash value:
GET /my_locations/_search{ "size" : 0, "aggs" : { "grouped" : { "geohash_grid" : { "field" : "location", "precision" : 2 } } } }
{
"took" : 10,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 3,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"grouped" : {
"buckets" : [
{
"key" : "u1",
"doc_count" : 2
},
{
"key" : "u0",
"doc_count" : 1
}
]
}
}
}
We can extract the documents on one of those buckets by executing a geo_grid query using the bucket key with the following syntax:
GET /my_locations/_search{ "query": { "geo_grid" :{ "location" : { "geohash" : "u0" } } } }
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "my_locations",
"_id" : "3",
"_score" : 1.0,
"_source" : {
"location" : "POINT(2.336389 48.861111)",
"city" : "Paris",
"name" : "Musée du Louvre"
}
}
]
}
}
Using a geotile_grid aggregation, it is possible to group documents depending on their geotile value:
GET /my_locations/_search{ "size" : 0, "aggs" : { "grouped" : { "geotile_grid" : { "field" : "location", "precision" : 6 } } } }
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 3,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"grouped" : {
"buckets" : [
{
"key" : "6/32/21",
"doc_count" : 2
},
{
"key" : "6/32/22",
"doc_count" : 1
}
]
}
}
}
We can extract the documents on one of those buckets by executing a geo_grid query using the bucket key with the following syntax:
GET /my_locations/_search{ "query": { "geo_grid" :{ "location" : { "geotile" : "6/32/22" } } } }
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "my_locations",
"_id" : "3",
"_score" : 1.0,
"_source" : {
"location" : "POINT(2.336389 48.861111)",
"city" : "Paris",
"name" : "Musée du Louvre"
}
}
]
}
}
Using a geohex_grid aggregation, it is possible to group documents depending on their geohex value:
GET /my_locations/_search{ "size" : 0, "aggs" : { "grouped" : { "geohex_grid" : { "field" : "location", "precision" : 1 } } } }
{
"took" : 2,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 3,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"grouped" : {
"buckets" : [
{
"key" : "81197ffffffffff",
"doc_count" : 2
},
{
"key" : "811fbffffffffff",
"doc_count" : 1
}
]
}
}
}
We can extract the documents on one of those buckets by executing a geo_grid query using the bucket key with the following syntax:
GET /my_locations/_search{ "query": { "geo_grid" :{ "location" : { "geohex" : "811fbffffffffff" } } } }
{
"took" : 26,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "my_locations",
"_id" : "3",
"_score" : 1.0,
"_source" : {
"location" : "POINT(2.336389 48.861111)",
"city" : "Paris",
"name" : "Musée du Louvre"
}
}
]
}
}