본문 바로가기
개발일기/DB

(수정) elasticsearch + mysql(RDS) + logstash 4탄, 나는 단지 geo_point type을 사용해 검색을 하고 싶었을 뿐이다

by 프로그래머콩 2022. 8. 19.

elasticsearch 쿼리 중에 geo_point 타입을 사용해

x, y좌표 insert하고 

활용해서 검색하는 그런 예제가 있다

 

나는 단지 그것을 활용하고 싶었을 뿐이었다

 

 

그런데 아무리 찾아봐도 내 입맛에 맞는

logstash input geo_point넣는 예제가 없어서

풀어보는 x, y 좌표 넣고 검색하기까지의 썰을 풀어보고자 한다

 

 

(설치는 생략)

 

logstash config에 input 정보 및(mysql), output 정보(el) 설정하기

input {
   jdbc { 

        jdbc_driver_library=>"\home\ubuntu\logstash-7.10.1\lib\jar_files\mysql-connector-java-8.0.19.jar"
        jdbc_driver_class => "com.mysql.jdbc.Driver"
        jdbc_connection_string => "jdbc:mysql://dev-metadata.rds주소:3306/database명"
        jdbc_user => "아이디"
        jdbc_password => "비밀임"
        jdbc_paging_enabled => true
        statement => "SELECT * FROM meta_school"
  }
}
output {
   amazon_es {
        hosts => ["endpoint"]
        index => "meta_school"
        #document_id => "%{[@metadata][_id]}"
   }
}

 

 

kibana 접속해 index 생성하는데, 좌표 넣을 필드 맵핑 "geo_point" 타입추가해서 생성하기 

PUT meta_school
{
  "settings": {
    "max_result_window": 100000,
    "analysis": {
      "normalizer": {
        "custom_normalizer": {
          "type": "custom",
          "filter": [
            "lowercase",
            "asciifolding"
          ]
        }
      },
      "analyzer": {
        "custom_analyzer": {
          "type": "custom",
          "tokenizer": "keyword",
          "filter": [
            "lowercase",
            "asciifolding"
          ]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "location": {
        "type": "geo_point"
      },
           "schul_code": {
        "type": "keyword"
      },
      "adrcd_id": {
        "type": "keyword"
      },
      "adrcd_nm": {
        "type": "keyword"
      },
      "adres_brkdn": {
        "type": "keyword"
      },
      "atpt_ofcdc_org_nm": {
        "type": "keyword"
      },
      "schul_nm": {
        "type": "keyword"
      },
      "schul_khd_sc_code": {
        "type": "geo_point"
      },
      "fond_sc_code": {
        "type": "keyword"
      },
      "hs_knd_sc_nm": {
        "type": "keyword"
      },
      "hmpg_adres": {
        "type": "keyword"
      },
      "codeu_sc_code": {
        "type": "keyword"
      },
      "in_date": {
        "type": "date"
      },
      "work_date": {
        "type": "date"
      }
    }
  }
}

 

 

logstash config 파일에 filter쿼리 추가하기

mysql에 미리 만들어둔 x,y값으로

location아래

{

lat : y,

lon::x

}

이런 형태로 치환해 넣는 작업 추가 할 예정

 

 

++++(수정)

# map_x, map_y 가 mysql에 들어있던 필드
# lon, lat이 es에 들어가면서 새로 생성될 필드

filter {
      mutate {
           add_field => {
                "lon" => "%{map_x}"
                "lat" => "%{map_y}"
                }
          convert => { "lon" => "float" }
          convert => { "lat" => "float" }
}
      mutate {
          rename => {
              "lon" => "[location][lon]"
              "lat" => "[location][lat]"
          }
      }
}

#ruby 부분을 주석 한 상태에서 lat, lon만 먼저 만드는 구문을 1차로 한번 넣고
#ruby{
#		code => 'event.set("[location][lat]", (float)event.get("map_y"))'
#	}
#ruby{
#		code => 'event.set("[location][lon]", (float)event.get("map_x"))'
#	}

1. ruby 부분을 주석 한 상태에서 lat, lon만 먼저 만드는 config 파일을 1차로 한번 돌리고

# map_x, map_y 가 mysql에 들어있던 필드
# lon, lat이 es에 들어가면서 새로 생성될 필드

filter {
      mutate {
           add_field => {
                "lon" => "%{map_x}"
                "lat" => "%{map_y}"
                }
          convert => { "lon" => "float" }
          convert => { "lat" => "float" }
}
      mutate {
          rename => {
              "lon" => "[location][lon]"
              "lat" => "[location][lat]"
          }
      }
}

ruby{
		code => 'event.set("[location][lat]", (float)event.get("map_y"))'
	}
ruby{
		code => 'event.set("[location][lon]", (float)event.get("map_x"))'
	}

2. ruby부분 주석제거 후 활성화해서 lat, lon을 넣어 주도록 한다 끝

 

실행 및 확인

bin/logstash -f logstash.conf

 

kibana dev툴 들어가

meta_school/mapping, count, search, 부터 차근차근 확인해보면

 

location 정상적으로 처리된것을 확인 할 수 있고

 

data 또한 올바르게 들어간것을 개수로 확인할 수 있었음

 

마지막으로 search로 데이터 또한 올바르게 들어간것을 확인 완료

elasticsearch 좌표 검색 쿼리 사용해보기 (distance & geo_location, geo_point)

# 예시

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