1 minute read

이 셀범위 내에선 대상물 검색의 점수를 높여주세요. 수보사분들의 피드백이였다.

여기서 셀이란, 수보사들이 맵을 이동시켜 클릭한 지점 반경 3km  내를 의미한다.

이걸 어떻게 구현할까, 이전에는 이동한 지역의 동 GIS 정보를 가져와 그 동내의 검색을 했지만, 동이라는 범위는 우리가 생각하는것 보다 훨씬 크다, 동내에만 수많은 아파트와 영업점들이 존재한다.

그런데 ES 내부에서도 GEO CODING이 가능한걸 안다면, 이러한 거리 정보를 컨트롤 하는것은 굉장히 쉬운일일 것이다.

이전장에서도 거리순으로 점수를 매기는 방법과, geo mappings에 대해 알아보았다. 이걸 좀 심화 하여, 매핑 셋팅과 직접 python 코드로 이걸 어떻게 검색할지 알아보도록 하자,

예제 프로젝트 는 여기서 받을수 있다.

Geo

검색엔진을 사용하는 여러 서비스들 중에 요즘은 모바일 기기들을 이용해서 위치 정보를 표시하거나 검색하는 서비스들이 많이 있다. Elasticsearch는 자바와 기타 프로그래밍 언어에서 제공하는 기본 데이터 타입 외 여러가지의 추상화 된 데이터 타입들이 있다.

그중 이런 위치 정보를 저장할수 있는 Geo PointGeo Shape 같은 타입들이 있다.

Geo Point

Geo Point 는 위도 경도 두개의 실수 값을 가지고 지도 위의 한 점을 나타내는 값입니다. Geo Point 필드의 값들은 다음과 같이 다양한 방법으로 입력이 가능하다

object 형식으로 geo_point 입력

PUT my_locations/_doc/1
{
  "location": {
    "lat": 41.12,
    "lon": -71.34
  }
}

PUT my_index/_doc/2
{
  "location": "41.12,-71.34"
}

PUT my_index/_doc/3
{
  "location": "drm3btev3e86"
}

PUT my_index/_doc/4
{
  "location": [
    -71.34,
    41.12
  ]
}

Text와 실수 방식은 위도와 경도의 입력 순서가 서로 반대이기 때문에 헷갈리기 쉽다. 왠만하면 object 방식을 사용하자.

geohash 는 전 세계 지도를 바둑판 모양의 격자로 나누어 각 칸마다 숫자와 알파벳으로 기호를 메시고, 그 칸을 다시 나우어 다시 기호를 추가하는 방식으로 표현

Geo Point 필드는 매핑에서 다음과 같이 “type”: “geo_point” 로 선언한다.

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

Geo Point 필드의 경우는 반드시 데이터를 입력하기 전에 인덱스 매핑을 정의해 주어야 한다. 매핑을 정의하지 않고 post를 통해 바로 입력을 한다면 다이나믹 매핑으로 필드가 자동 생성 될 때 geo_point 타입의 필드가 생기는 것이 나닌 float 타입의 필드가 생성이 된다.