Geodistance 집계
Geodistance 집계
geo_distance 집계는 문서를 중심점(central point) 주변의 거리 기반 링(ring)으로 그룹화해요. 각 범위가 링을 정의하며, 문서의 geo_point 필드 값이 지정된 origin에서 얼마나 떨어져 있는지에 따라 버킷에 배치돼요. 이는 개념적으로 range 집계와 비슷하지만 숫자 값이 아닌 지리적 좌표에 대해 동작해요.
대상 필드는 geo_point로 매핑되어야 해요. 문서의 geo_point 필드에 여러 값이 포함된 경우 모든 거리가 평가되고 문서는 그에 따라 버킷팅돼요.
출처: 문서
본문
파라미터 (Parameters)
geo_distance 집계는 다음 파라미터를 받아요.
| 파라미터 | 필수/선택 | 데이터 타입 | 설명 |
|---|---|---|---|
| field | 필수 | String | 거리를 계산할 geo_point 필드. |
| origin | 필수 | Object, String, 또는 Array | 거리를 측정하는 중심점. 객체 형식({"lat": 40.71, "lon": -74.00}), 문자열 형식("40.71, -74.00"), 또는 GeoJSON 배열 형식([-74.00, 40.71])을 받아요. |
| ranges | 필수 | Array | 버킷을 정의하는 거리 범위 목록. 각 범위는 from, to, 그리고 선택적으로 key를 포함할 수 있어요. |
| unit | 선택 | String | ranges의 거리 값 단위. 기본값은 m(미터)이에요. 유효한 값: m, km, mi, yd, in, cm, mm. |
| distance_type | 선택 | String | 거리를 계산하는 데 사용하는 알고리즘. 유효한 값은 다음과 같아요: |
| - arc: 지구의 완전한 구면 기하를 사용해 거리를 계산. 가장 정확하지만 가장 느려요. | |||
| - plane: 좌표를 평평한 평면에 투영하고 유클리드 거리를 계산. 가장 빠르지만 정확도가 가장 낮아요. 작은 지리적 영역(약 5km 이하)에만 적합해요. | |||
| 기본값은 arc예요. | |||
| keyed | 선택 | Boolean | true면 버킷을 배열 대신 범위 이름으로 키가 지정된 객체로 반환해요. 기본값은 false예요. |
예제: 기본 거리 링 (Basic distance rings)
다음 예제는 전자상거래 주문을 뉴욕 시 주변의 세 가지 거리 링으로 그룹화하며, 마일 단위로 측정해요:
GET /opensearch_dashboards_sample_data_ecommerce/_search
{
"size": 0,
"aggs": {
"distance_from_nyc": {
"geo_distance": {
"field": "geoip.location",
"origin": "40.7128, -74.0060",
"unit": "mi",
"ranges": [
{ "to": 50 },
{ "from": 50, "to": 500 },
{ "from": 500 }
]
}
}
}
}
예제: 커스텀 범위 이름의 키드 응답 (Keyed response with custom range names)
keyed를 true로 설정하면 버킷을 배열 대신 객체로 반환해요. key 속성을 사용해 각 범위에 커스텀 이름을 지정할 수 있어요:
GET /opensearch_dashboards_sample_data_ecommerce/_search
{
"size": 0,
"aggs": {
"distance_from_nyc": {
"geo_distance": {
"field": "geoip.location",
"origin": "40.7128, -74.0060",
"unit": "mi",
"keyed": true,
"ranges": [
{ "to": 50, "key": "local" },
{ "from": 50, "to": 500, "key": "domestic" },
{ "from": 500, "key": "international" }
]
}
}
}
}
예제 응답 (Example response)
다음 응답은 keyed 예제에 해당해요:
{
"took": 18,
"timed_out": false,
"terminated_early": true,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 4675,
"relation": "eq"
},
"max_score": null,
"hits": []
},
"aggregations": {
"distance_from_nyc": {
"buckets": {
"local": {
"from": 0.0,
"to": 50.0,
"doc_count": 896
},
"domestic": {
"from": 50.0,
"to": 500.0,
"doc_count": 0
},
"international": {
"from": 500.0,
"doc_count": 3779
}
}
}
}
}
응답 본문 필드 (Response body fields)
| 필드 | 데이터 타입 | 설명 |
|---|---|---|
| buckets | Array 또는 Object | 거리 버킷. 기본적으로 배열로, keyed가 true면 객체로 반환돼요. |
| buckets.key | String | 자동 생성된 범위 레이블(예: *-500.0 또는 500.0-3000.0), 또는 지정된 커스텀 키. |
| buckets.from | Double | 지정된 단위의 거리 범위 하한. |
| buckets.to | Double | 지정된 단위의 거리 범위 상한. |
| buckets.doc_count | Integer | 이 거리 범위 안에 속하는 문서 수. |