原英文版地址: https://www.elastic.co/guide/en/elasticsearch/reference/7.7/search-aggregations-bucket-geodistance-aggregation.html, 原文档版权归 www.elastic.co 所有
本地英文版地址: ../en/search-aggregations-bucket-geodistance-aggregation.html
本地英文版地址: ../en/search-aggregations-bucket-geodistance-aggregation.html
重要: 此版本不会发布额外的bug修复或文档更新。最新信息请参考 当前版本文档。
一个多桶聚合,作用于 geo_point
字段,在概念上与range聚合非常相似。
用户可以定义一个原点和一组距离范围桶。
该聚合计算每个文档值与原点的距离,并根据范围确定其所属的桶(如果文档与原点之间的距离在该桶的距离范围内,则该文档属于该桶)。
PUT /museums { "mappings": { "properties": { "location": { "type": "geo_point" } } } } POST /museums/_bulk?refresh {"index":{"_id":1}} {"location": "52.374081,4.912350", "name": "NEMO Science Museum"} {"index":{"_id":2}} {"location": "52.369219,4.901618", "name": "Museum Het Rembrandthuis"} {"index":{"_id":3}} {"location": "52.371667,4.914722", "name": "Nederlands Scheepvaartmuseum"} {"index":{"_id":4}} {"location": "51.222900,4.405200", "name": "Letterenhuis"} {"index":{"_id":5}} {"location": "48.861111,2.336389", "name": "Musée du Louvre"} {"index":{"_id":6}} {"location": "48.860000,2.327000", "name": "Musée d'Orsay"} POST /museums/_search?size=0 { "aggs" : { "rings_around_amsterdam" : { "geo_distance" : { "field" : "location", "origin" : "52.3760, 4.894", "ranges" : [ { "to" : 100000 }, { "from" : 100000, "to" : 300000 }, { "from" : 300000 } ] } } } }
响应:
{ ... "aggregations": { "rings_around_amsterdam" : { "buckets": [ { "key": "*-100000.0", "from": 0.0, "to": 100000.0, "doc_count": 3 }, { "key": "100000.0-300000.0", "from": 100000.0, "to": 300000.0, "doc_count": 1 }, { "key": "300000.0-*", "from": 300000.0, "doc_count": 2 } ] } } }
指定字段的类型必须是geo_point
(只能在映射中显式设置)。
它还可以保存一个geo_point
字段数组,在这种情况下,所有这些都将在聚合过程中考虑在内。
原点可以接受geo_point
类型支持的所有格式:
-
对象格式:
{ "lat" : 52.3760, "lon" : 4.894 }
- 这是最安全的格式,因为它对lat
和lon
值最明确 -
字符串格式:
"52.3760, 4.894"
- 第一个值是lat
,第二个是lon
-
数组格式:
[4.894, 52.3760]
- 基于GeoJson
标准,第一个值是lon
,第二个是lat
默认情况下,距离的单位是 m
(米),但也接受:mi
(英里), in
(英尺), yd
(码), km
(千米), cm
(厘米), mm
(毫米).
POST /museums/_search?size=0 { "aggs" : { "rings" : { "geo_distance" : { "field" : "location", "origin" : "52.3760, 4.894", "unit" : "km", "ranges" : [ { "to" : 100 }, { "from" : 100, "to" : 300 }, { "from" : 300 } ] } } } }
有两种距离计算模式:arc
(默认) 和 plane
。
arc
计算是最精确的,plane
最快但最不精确。
当搜索环境“狭窄”,并且跨越较小的地理区域(约5公里)时,请考虑使用plane
。
对于非常大的区域的搜索(例如跨洲搜索),plane
将返回更高的误差。。
可以使用参数distance_type
设置距离计算类型:
POST /museums/_search?size=0 { "aggs" : { "rings" : { "geo_distance" : { "field" : "location", "origin" : "52.3760, 4.894", "unit" : "km", "distance_type" : "plane", "ranges" : [ { "to" : 100 }, { "from" : 100, "to" : 300 }, { "from" : 300 } ] } } } }
将 keyed
标志设置为 true
会将唯一的字符串键与每个桶相关联,并将范围作为哈希而不是数组返回:
POST /museums/_search?size=0 { "aggs" : { "rings_around_amsterdam" : { "geo_distance" : { "field" : "location", "origin" : "52.3760, 4.894", "ranges" : [ { "to" : 100000 }, { "from" : 100000, "to" : 300000 }, { "from" : 300000 } ], "keyed": true } } } }
响应:
{ ... "aggregations": { "rings_around_amsterdam" : { "buckets": { "*-100000.0": { "from": 0.0, "to": 100000.0, "doc_count": 3 }, "100000.0-300000.0": { "from": 100000.0, "to": 300000.0, "doc_count": 1 }, "300000.0-*": { "from": 300000.0, "doc_count": 2 } } } } }
也可以为每个范围定制一个键:
POST /museums/_search?size=0 { "aggs" : { "rings_around_amsterdam" : { "geo_distance" : { "field" : "location", "origin" : "52.3760, 4.894", "ranges" : [ { "to" : 100000, "key": "first_ring" }, { "from" : 100000, "to" : 300000, "key": "second_ring" }, { "from" : 300000, "key": "third_ring" } ], "keyed": true } } } }
响应:
{ ... "aggregations": { "rings_around_amsterdam" : { "buckets": { "first_ring": { "from": 0.0, "to": 100000.0, "doc_count": 3 }, "second_ring": { "from": 100000.0, "to": 300000.0, "doc_count": 1 }, "third_ring": { "from": 300000.0, "doc_count": 2 } } } } }