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
}
}
}
}
끝
'개발일기 > DB-Elasticsearch' 카테고리의 다른 글
(수정) elasticsearch + logstash 설치 2탄, AWS와 연결 성공! (0) | 2022.08.11 |
---|