Geohex grid 집계
Geohex grid 집계
육각 계층 지리 공간 색인 시스템(Hexagonal Hierarchical Geospatial Indexing System, H3)은 지구의 영역을 식별 가능한 육각형 셀로 분할해요.
H3 그리드 시스템은 Geohash의 비균일 분할의 한계를 극복하므로 근접성(proximity) 애플리케이션에 잘 맞아요. Geohash는 위도와 경도 쌍을 인코딩해 극지방 근처에서 훨씬 더 작은 분할과 적도 근처에서 1경도 크기를 만들 수 있어요. 반면 H3 그리드 시스템의 왜곡은 낮고 122개 중 5개 분할로 제한돼요. 이 다섯 개 분할은 사용 빈도가 낮은 영역(예: 바다 한가운데)에 배치되어, 필수 영역은 오류가 없도록 남겨요. 따라서 H3 그리드 시스템을 기반으로 문서를 그룹화하면 Geohash 그리드보다 더 나은 집계를 제공해요.
geohex grid 집계는 지리적 분석을 위해 지리 포인트를 그리드 셀로 그룹화해요. 각 그리드 셀은 H3 셀에 해당하며 H3Index 표현으로 식별돼요.
출처: 문서
본문
정밀도 (Precision)
precision 파라미터는 그리드 셀 크기를 결정하는 세분성 수준을 제어해요. precision이 낮을수록 그리드 셀이 커져요.
다음 예제는 저정밀도와 고정밀도 집계 요청을 보여줘요.
먼저 인덱스를 만들고 location 필드를 geo_point로 매핑해요:
PUT national_parks
{
"mappings": {
"properties": {
"location": {
"type": "geo_point"
}
}
}
}
샘플 인덱스에 다음 문서들을 색인해요:
PUT national_parks/_doc/1
{
"name": "Yellowstone National Park",
"location": "44.42, -110.59"
}
PUT national_parks/_doc/2
{
"name": "Yosemite National Park",
"location": "37.87, -119.53"
}
PUT national_parks/_doc/3
{
"name": "Death Valley National Park",
"location": "36.53, -116.93"
}
geopoint를 여러 형식으로 색인할 수 있어요. 지원되는 모든 형식 목록은 geopoint 문서를 참고하세요.
저정밀도 요청 (Low-precision requests)
세 문서를 모두 함께 버킷팅하는 저정밀도 요청을 실행해요:
GET national_parks/_search
{
"aggregations": {
"grouped": {
"geohex_grid": {
"field": "location",
"precision": 1
}
}
}
}
geohex grid 집계 쿼리에는 GET 또는 POST HTTP 메서드를 사용할 수 있어요.
응답은 문서 2와 3이 하나의 그리드 셀에 버킷팅될 만큼 가깝기 때문에 함께 그룹화해요:
{
"took" : 4,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 3,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "national_parks",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"name" : "Yellowstone National Park",
"location" : "44.42, -110.59"
}
},
{
"_index" : "national_parks",
"_id" : "2",
"_score" : 1.0,
"_source" : {
"name" : "Yosemite National Park",
"location" : "37.87, -119.53"
}
},
{
"_index" : "national_parks",
"_id" : "3",
"_score" : 1.0,
"_source" : {
"name" : "Death Valley National Park",
"location" : "36.53, -116.93"
}
}
]
},
"aggregations" : {
"grouped" : {
"buckets" : [
{
"key" : "8129bffffffffff",
"doc_count" : 2
},
{
"key" : "8128bffffffffff",
"doc_count" : 1
}
]
}
}
}
고정밀도 요청 (High-precision requests)
이제 고정밀도 요청을 실행해요:
GET national_parks/_search
{
"aggregations": {
"grouped": {
"geohex_grid": {
"field": "location",
"precision": 6
}
}
}
}
세분성이 더 높기 때문에 세 문서 모두 별도로 버킷팅돼요:
{
"took" : 5,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 3,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "national_parks",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"name" : "Yellowstone National Park",
"location" : "44.42, -110.59"
}
},
{
"_index" : "national_parks",
"_id" : "2",
"_score" : 1.0,
"_source" : {
"name" : "Yosemite National Park",
"location" : "37.87, -119.53"
}
},
{
"_index" : "national_parks",
"_id" : "3",
"_score" : 1.0,
"_source" : {
"name" : "Death Valley National Park",
"location" : "36.53, -116.93"
}
}
]
},
"aggregations" : {
"grouped" : {
"buckets" : [
{
"key" : "8629ab6dfffffff",
"doc_count" : 1
},
{
"key" : "8629857a7ffffff",
"doc_count" : 1
},
{
"key" : "862896017ffffff",
"doc_count" : 1
}
]
}
}
}
필터링 요청 (Filtering requests)
고정밀도 요청은 리소스 집약적이므로 geo_bounding_box 같은 필터를 사용해 지리적 영역을 제한하는 것을 권장해요. 예를 들어 다음 쿼리는 검색 영역을 제한하는 필터를 적용해요:
GET national_parks/_search
{
"size" : 0,
"aggregations": {
"filtered": {
"filter": {
"geo_bounding_box": {
"location": {
"top_left": "38, -120",
"bottom_right": "36, -116"
}
}
},
"aggregations": {
"grouped": {
"geohex_grid": {
"field": "location",
"precision": 6
}
}
}
}
}
}
응답은 geo_bounding_box 경계 안에 있는 두 문서를 포함해요:
{
"took" : 4,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 3,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"filtered" : {
"doc_count" : 2,
"grouped" : {
"buckets" : [
{
"key" : "8629ab6dfffffff",
"doc_count" : 1
},
{
"key" : "8629857a7ffffff",
"doc_count" : 1
}
]
}
}
}
}
또한 bounds 파라미터에 경계 상자의 좌표를 제공해 지리적 영역을 제한할 수도 있어요. bounds와 geo_bounding_box 좌표 모두 geopoint 형식 중 하나로 지정할 수 있어요. 다음 쿼리는 bounds 파라미터에 WKT(well-known text) "POINT(longitude latitude)" 형식을 사용해요:
GET national_parks/_search
{
"size": 0,
"aggregations": {
"grouped": {
"geohex_grid": {
"field": "location",
"precision": 6,
"bounds": {
"top_left": "POINT (-120 38)",
"bottom_right": "POINT (-116 36)"
}
}
}
}
}
응답은 지정된 bounds 안에 있는 두 결과만 포함해요:
{
"took" : 3,
"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" : "8629ab6dfffffff",
"doc_count" : 1
},
{
"key" : "8629857a7ffffff",
"doc_count" : 1
}
]
}
}
}
bounds 파라미터는 geo_bounding_box 필터와 함께 또는 없이 사용할 수 있어요. 이 두 파라미터는 독립적이며 서로 어떤 공간적 관계를 가질 수 있어요.
지원되는 파라미터 (Supported parameters)
Geohex grid 집계 요청은 다음 파라미터를 지원해요.
| 파라미터 | 데이터 타입 | 설명 |
|---|---|---|
| field | String | geopoint를 포함하는 필드. 이 필드는 geo_point 필드로 매핑되어야 해요. 필드가 배열을 포함하면 모든 배열 값이 집계돼요. 필수. |
| precision | Integer | 결과 버킷팅을 위한 그리드 셀을 결정하는 데 사용되는 세분성 수준. 셀은 요청된 precision의 지정된 크기(대각선)를 초과할 수 없어요. 유효한 값은 [0, 15] 범위예요. 선택. 기본값은 5예요. |
| bounds | Object | geopoint 필터링을 위한 경계 상자. 경계 상자는 왼쪽 위와 오른쪽 아래 꼭짓점으로 정의돼요. 꼭짓점은 다음 형식 중 하나로 geopoint로 지정돼요: |
| - 위도와 경도가 있는 객체 | ||
| - [longitude, latitude] 형식의 배열 | ||
| - "latitude,longitude" 형식의 문자열 | ||
| - geohash | ||
| - WKT | ||
| 형식 예제는 geopoint 형식을 참고하세요. 선택. | ||
| size | Integer | 반환할 버킷의 최대 수. 버킷이 size보다 많으면 OpenSearch는 문서가 더 많은 버킷을 반환해요. 선택. 기본값은 10,000이에요. |
| shard_size | Integer | 각 샤드에서 반환할 버킷의 최대 수. 선택. 기본값은 max(10, size · number of shards)로, 더 높은 우선순위 버킷의 더 정확한 개수를 제공해요. |