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 성능 최적화 및 실전 활용법을 다루겠습니다! 🚀
'Elastic Search > 인덱스 설정과 매핑' 카테고리의 다른 글
[Elasticsearch] 멀티 필드 (Multi Field) 완벽 정리 (0) | 2025.02.03 |
---|---|
[Mappings] 기타 필드 타입 (IP, Range, Binary) 완벽 정리 (0) | 2025.02.03 |
[Mappings] Object vs Nested 타입 완벽 정리 (0) | 2025.02.03 |
[Mappings] Boolean(불리언) 타입 완벽 정리 (0) | 2025.02.03 |
[Mappings] 날짜(Date) 타입 완벽 정리 (0) | 2025.02.03 |