티스토리 뷰

날짜 타입 (date)

  • 자동으로 날짜로 인식하는 형식 : ISO8601
  • format 옵션을 이용한 날짜 형식 지정

객체 타입 (object, nested)

  • object 와 nested 타입 비교
  • nested 쿼리 이용

위치 정보 타입 (geo_point, geo_shape)

  • geo_point 가 지원하는 다양한 입력 형식
  • 위치정보 쿼리 : geo_distance, geo_bounding_box

검색엔진을 사용하는 여러 서비스들 중에 요즘은 모바일 기기들을 이용해서 위치 정보를 표시하거나 검색하는 서비스들이 많이 있습니다. Elasticsearch는 자바와 기타 프로그래밍 언어에서 제공하는 기본 데이터 타입 외에도 여러가지의 추상화 된 데이터 타입들이 있습니다. 그 중에 이런 위치정보를 저장할 수 있는 Geo Point Geo Shape 같은 타입들이 있습니다.
Geo Point
Geo Point 는 위도(latitude)와 경도(longitude) 두 개의 실수 값을 가지고 지도 위의 한 점을 나타내는 값입니다. Geo Point 필드의 값들은 다음과 같이 다양한 방법으로 입력이 가능합니다.
 
 
# object 형식으로 geo_point 입력
PUT my_locations/_doc/1
{
  "location": {
    "lat": 41.12,
    "lon": -71.34
  }
}

# text 형식으로 geo_point 입력
PUT my_index/_doc/2
{
  "location": "41.12,-71.34"
}

# geohash 형식으로 geo_point 입력
PUT my_index/_doc/3
{
  "location": "drm3btev3e86"
}

# 실수의 배열 형식으로 geo_point 입력
PUT my_index/_doc/4
{
  "location": [
    -71.34,
    41.12
  ]
}

geo_point 를 mapping 하지 않으면 제대로 사용이 불가능합니다.

request

 

reponse
location 밑에 각각 float 형식으로 되어있기때문에 mapping 을 미리 정의해주셔야합니다.
PUT my_geo
{
  "mappings": {
    "properties": {
      "location": {
        "type": "geo_point"
      }
    }
  }
}
 
쿼리로 하는걸 하기위해 일단 데이터를 넣어볼게요.
 
geo_bounding_box 쿼리
Elasticsearch에는 위치정보를 검색할 수 있는 다양한 쿼리들이 있습니다. geo_point 값의 검색에 주로 사용 되는 것은 geo_bounding_box 쿼리와 geo_distance 쿼리 입니다. 예제 위해 먼저 다음 도큐먼트들을 my_geo 인덱스에 벌크로 입력하겠습니다. location 필드의 타입을 "type": "geo_point" 로 매핑을 먼저 설정해야 하는 것을 잊지 마세요.
PUT my_geo/_bulk
{"index":{"_id":"1"}}
{"station":"강남","location":{"lon":127.027926,"lat":37.497175},"line":"2호선"}
{"index":{"_id":"2"}}
{"station":"종로3가","location":{"lon":126.991806,"lat":37.571607},"line":"3호선"}
{"index":{"_id":"3"}}
{"station":"여의도","location":{"lon":126.924191,"lat":37.521624},"line":"5호선"}
{"index":{"_id":"4"}}
{"station":"서울역","location":{"lon":126.972559,"lat":37.554648},"line":"1호선"}
geo_bounding_box 쿼리는 top_leftbottom_right 두 개의 옵션에 각각 위치점을 입력하고 이 점들을 토대로 그린 네모 칸 안에 위치하는 도큐먼트들을 불러옵니다. 다음은 {"lat": 37.4899, "lon": 127.0388}, {"lat": 37.5779, "lon": 126.9617} 두 점을 기준으로 하는 네모 영역 안에 있는 도큐먼트들을 가져오는 예제입니다.
GET my_geo/_search
{
  "query": {
    "geo_bounding_box": {
      "location": {
        "bottom_right": {
          "lat": 37.4899,
          "lon": 127.0388
        },
        "top_left": {
          "lat": 37.5779,
          "lon": 126.9617
        }
      }
    }
  }
}
 
 
geo_distance 쿼리
geo_distance 쿼리는 하나의 위치점을 찍고 distance 옵션을 이용해서 입력한 반경의 원 안에 있는 도큐먼트들을 불러옵니다. 다음은 {"lat": 37.5358, "lon": 126.9559} 기준으로 반경 5킬로미터 안에 있는 도큐먼트들을 불러오는 예제입니다.
GET my_geo/_search
{
  "query": {
    "geo_distance": {
      "distance": "5km",
      "location": {
        "lat": 37.5358,
        "lon": 126.9559
      }
    }
  }
}
 
 
geo_shape 는 가이드북 참고해주시길 바랍니다.
 
 
 
참고

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함