Elasticsearch: 위치 정보 (Geo Point & Geo Shape) 완벽 정리

Elasticsearch는 위치 정보(Geo Data)를 저장하고 검색할 수 있도록
Geo Point (한 점의 위도·경도 좌표)
Geo Shape (점, 선, 다각형 등 복잡한 형태)
위치 기반 검색 (거리, 범위, 포함 관계)

을 지원합니다. 이번 글에서는 위치 정보의 저장 방식, 검색 방식, 그리고 실전 활용 예제까지 상세히 알아보겠습니다.


1. Elasticsearch에서 지원하는 위치 정보 타입

타입 특징 사용 예시
Geo Point 위도(latitude), 경도(longitude) 좌표를 저장 특정 좌표에서 가까운 위치 검색
Geo Shape 다각형, 선, 여러 개의 점 등 복잡한 형태 저장 가능 행정 구역, 도로망, 특정 지역 검색

2. Geo Point

🔹 Geo Point란?

✔ 하나의 점(위도·경도)을 저장하는 데이터 타입
다양한 형식으로 좌표 입력 가능

📌 예제 1: Geo Point 필드 매핑 설정

PUT my_locations
{
  "mappings": {
    "properties": {
      "location": {
        "type": "geo_point"
      }
    }
  }
}

Geo Point 필드는 반드시 사전 매핑 설정 필요!

📌 예제 2: 다양한 형식으로 좌표 입력하기

PUT my_locations/_doc/1
{
  "location": { "lat": 41.12, "lon": -71.34 }  // 객체 형식
}
PUT my_locations/_doc/2
{
  "location": "41.12,-71.34"  // 문자열 형식
}
PUT my_locations/_doc/3
{
  "location": [ -71.34, 41.12 ]  // 배열 형식 (경도, 위도 순서)
}
PUT my_locations/_doc/4
{
  "location": "drm3btev3e86"  // geohash 형식
}

객체, 문자열, 배열, geohash 등 다양한 형식 지원
배열 형식은 "경도(lon) → 위도(lat)" 순서 주의!


3. Geo Point 검색 (Bounding Box & Distance)

🔹 Bounding Box 쿼리 (네모 영역 검색)

위쪽 좌표(top_left)와 아래쪽 좌표(bottom_right)로 범위 지정
네모 범위 내에 포함된 모든 위치 검색

📌 예제 3: 특정 영역 내에 위치한 점 찾기

GET my_locations/_search
{
  "query": {
    "geo_bounding_box": {
      "location": {
        "top_left": { "lat": 37.5779, "lon": 126.9617 },
        "bottom_right": { "lat": 37.4899, "lon": 127.0388 }
      }
    }
  }
}

지정된 네모 영역 내에 위치한 좌표 검색 가능


🔹 Distance 쿼리 (반경 검색)

하나의 기준점에서 일정 거리 내에 있는 좌표 검색
"반경 5km 안에 있는 위치" 같은 검색에 사용

📌 예제 4: 반경 5km 내에 위치한 점 찾기

GET my_locations/_search
{
  "query": {
    "geo_distance": {
      "distance": "5km",
      "location": { "lat": 37.5358, "lon": 126.9559 }
    }
  }
}

반경 5km 안에 포함된 모든 위치 검색 가능
distance 값을 10km, 20km로 변경하여 범위 조절 가능


4. Geo Shape

 

 

🔹 Geo Shape이란?

다각형, 선, 직사각형 등 복잡한 위치 정보 저장 가능
행정 구역, 특정 지역 검색에 활용

📌 예제 5: Geo Shape 필드 매핑 설정

PUT my_shapes
{
  "mappings": {
    "properties": {
      "location": {
        "type": "geo_shape"
      }
    }
  }
}

Geo Shape은 점(Point)뿐만 아니라 선(Line), 다각형(Polygon)도 저장 가능

📌 예제 6: 다양한 Geo Shape 데이터 저장

PUT my_shapes/_doc/1
{
  "location": {
    "type": "point",
    "coordinates": [127.027926, 37.497175]
  }
}
PUT my_shapes/_doc/2
{
  "location": {
    "type": "polygon",
    "coordinates": [
      [
        [127.027926, 37.497175],
        [126.991806, 37.571607],
        [126.924191, 37.521624],
        [127.027926, 37.497175]  // 시작점과 동일해야 함
      ]
    ]
  }
}

다각형은 반드시 첫 번째 좌표와 마지막 좌표가 동일해야 함


5. Geo Shape 검색 (Intersects, Within, Disjoint)

Geo Shape을 이용한 복잡한 위치 검색 가능
관계(Relation) 옵션을 사용하여 다양한 검색 가능

Relation 값 설명

   
intersects 쿼리 영역과 조금이라도 겹치는 도큐먼트 검색
within 쿼리 영역에 완전히 포함되는 도큐먼트 검색
disjoint 쿼리 영역과 겹치지 않는 도큐먼트 검색

📌 예제 7: 특정 영역과 겹치는 위치 찾기 (intersects)

GET my_shapes/_search
{
  "query": {
    "geo_shape": {
      "location": {
        "shape": {
          "type": "envelope",
          "coordinates": [
            [126.9687, 37.58], 
            [126.99, 37.5543]
          ]
        },
        "relation": "intersects"
      }
    }
  }
}

지정된 영역과 겹치는 도큐먼트 검색 가능


6. Object vs Geo Point vs Geo Shape 비교

     
Object JSON 객체 내부에 lat, lon 필드 저장 일반 텍스트 필드처럼 다룸
Geo Point 위도·경도를 한 점으로 저장 거리 기반 검색 가능 (geo_distance)
Geo Shape 다각형, 선, 다중 점 등 복잡한 형태 저장 특정 영역 검색 (geo_shape)

7. 정리

     
Geo Point 하나의 위도·경도를 저장 "서울역에서 반경 5km 내" 검색
Geo Shape 다각형, 선, 직사각형 등 복잡한 형태 저장 "강남구에 포함된 장소" 검색
Bounding Box Query 네모 영역 내 좌표 검색 "서울 시내에 포함된 역 찾기"
Distance Query 반경 내 좌표 검색 "5km 이내에 있는 카페 검색"
Geo Shape Query 특정 지역과 겹치는 도큐먼트 검색 "서울시 안에 완전히 포함된 도로 찾기"

8. 학습 가이드

1️⃣ Geo Point와 Geo Shape 데이터를 각각 저장하여 테스트
2️⃣ Bounding Box & Distance Query를 사용하여 위치 검색 실습
3️⃣ Geo Shape Query를 활용하여 특정 지역 검색 테스트


9. 마무리

Elasticsearch의 위치 정보(Geo Data) 기능을 활용하면
위치 기반 검색 (반경 내 검색, 특정 지역 검색 등)
복잡한 지도 데이터 처리 (도로망, 행정 구역 등)
다양한 위치 필터링 및 최적화된 공간 검색

을 쉽게 구현할 수 있습니다.

다음 학습에서는 Geo Query 성능 최적화 및 실전 활용법을 다루겠습니다! 🚀

+ Recent posts