아빠는 개발자

[java] API - geo distance 본문

Java/API

[java] API - geo distance

father6019 2023. 10. 21. 21:50
728x90
반응형

Elasticsearch high level client 를 사용해서 거리안에 있는 위치를 구하는 API 를 만들어보자

우선 위도 경도를 어떻게 구할것이냐.. google map에서 확인할 수 있다는데 안나오드라..

 

그래서 검색해보니 찾은 사이트

http://map.esran.com/

여기서 확인할 수 있다. 

지역을 검색하고 지도를 클릭하면  위도, 경도를 확인 할 수  있음.

컨트롤러에서는 거리만 받을 예정 

@CrossOrigin("*")
@ApiOperation(value = "search", notes = "검색")
@GetMapping("distance")
public CommonResult getDistance(
        @ApiParam(value = "distance") @RequestParam(value = "distance", defaultValue = "5", required = true) @Validated final String distance
) {
    return distanceService.getDistance(distance);
}

 

서비스 에서는 간단한 쿼리 작성

SearchRequest distanceRequest = new SearchRequest();
distanceRequest.indices(ElasticStatic.LOCATION.getAlias());
SearchSourceBuilder aggsSourceBuilder = new SearchSourceBuilder();
QueryBuilder aggsQueryBuilder = QueryBuilders.geoDistanceQuery("location").point(lat, lon).distance( distance +"km");
aggsSourceBuilder.query(aggsQueryBuilder);
aggsSourceBuilder.size(10);
distanceRequest.source(aggsSourceBuilder);
SearchResponse aggsResponse = client.search(distanceRequest, RequestOptions.DEFAULT);
List<Map<String, Object>> aggsValue = new ArrayList<>();
SearchHit[] aggsResults = aggsResponse.getHits().getHits();
Arrays.stream(aggsResults).forEach(hit -> {
    Map<String, Object> result = hit.getSourceAsMap();
    result.put("score", hit.getScore());
    aggsValue.add(result);
});

 

쿼리를 뽑아보면 

아래와 같이 뽑히는ep  location 배열을 값들은  double 형태의 위도 경도 값 입력  코드에서는 2km 을 입력했는데 뽑힌 쿼리에서는 m 단위로 뽑혀있음..

GET location/_search
{
  "size": 10,
  "query": {
    "geo_distance": {
      "location": [
        126.90500268692999,
        37.48822057363974
      ],
      "distance": 2000,
      "distance_type": "arc",
      "validation_method": "STRICT",
      "ignore_unmapped": false,
      "boost": 1
    }
  }
}

5 km 넣고 api swagger 에서 실행하니 

 

redis cli 접속 

docker exec -it redis_test redis-cli

 

 

cache 를 적용해보자

@Cacheable(value = CacheKey.DISTANCE, key = "#distance", unless = "#result == null")

cache 생성 확인 

 

data를 조회 해보자

127.0.0.1:6379> get distance::5

 

728x90
반응형

'Java > API' 카테고리의 다른 글

[java] API method cache  (1) 2023.10.28
[java] API Controller에서 데이터를 받아오는 방법  (1) 2023.10.28
[java] API - 검색 api 성능 개선 final  (0) 2023.10.14
[java] API - redis cache for method  (0) 2023.10.13
[java] API - redis cache  (0) 2023.10.08