[ Spring Boot ] 인기 검색어 로직 구현

5tr1ker·2024년 5월 22일
0

Spring

목록 보기
11/16
post-thumbnail

개요

이번 프로젝트에서 실시간 인기 검색어를 구현하기 위해서 사용해야 하는 알고리즘을 분석하고, 구현하기 위해 해당 포스팅을 작성하게 되었습니다.

인기 검색어 알고리즘

우선 인기 검색어 기능을 구현하기 위해 고려해야 하는 점은 밑과 같습니다.

  1. 시간 가중치를 두어 최근에 검색된 검색어에 더 높은 점수를 부여
  2. 전체 검색량에 따라 점수 보정 ( 이전에 검색량이 많다면 낮은 점수를 부여 )
    ㄴ 이때 00시에 모든 가중치 데이터를 초기화 할 경우, 인기 검색어 데이터가 모이지 않은 경우 인기 검색어가 없어지는 문제가 발생하여 이전 데이터도 활용
  • 시간 가중치 : 인기 검색어 랭킹에서 최신 정보를 반영하기 위해 시간 가중치를 부여하여, 최근에 검색된 검색어에 더 높은 가중치를 적용합니다.

score 는 24시간 동안 검색량 대비 최근 검색량의 비율을 나타내며, 점수가 높을 수록 지난 24시간보다 검색 빈도가 더 높다는 것을 의미합니다.

최종 로직

        
double recentlyScore = 1시간 검색 횟수 * 0.15 + 전체 검색 횟수 * 0.05
double dayScore = 일일 검색 횟수 * 0.12 + 전체 검색 횟수 * 0.04
double weekScore = 일주일간 검색 횟수 * 0.04 + 전체 검색 횟수 * 0.03

double score = ( recentlyScore + dayScore + weekScore )

입 출력 값

1시간 검색량 : 8.00 1일 검색량 : 7.00 주간 검색률 : 3.00 전체 검색량 : 30.00 점수 : 5.760000000000
1시간 검색량 : 10.00 1일 검색량 : 12.00 주간 검색률 : 15.00 전체 검색량 : 30.00 점수 : 7.140000000000
1시간 검색량 : 8.00 1일 검색량 : 11.00 주간 검색률 : 20.00 전체 검색량 : 30.00 점수 : 6.920000000000
1시간 검색량 : 7.00 1일 검색량 : 19.00 주간 검색률 : 21.00 전체 검색량 : 30.00 점수 : 7.770000000000
1시간 검색량 : 12.00 1일 검색량 : 14.00 주간 검색률 : 19.00 전체 검색량 : 30.00 점수 : 7.840000000000
1시간 검색량 : 15.00 1일 검색량 : 22.00 주간 검색률 : 28.00 전체 검색량 : 30.00 점수 : 9.610000000000
1시간 검색량 : 3.00 1일 검색량 : 24.00 주간 검색률 : 28.00 전체 검색량 : 30.00 점수 : 8.050000000000
1시간 검색량 : 6.00 1일 검색량 : 28.00 주간 검색률 : 30.00 전체 검색량 : 30.00 점수 : 9.060000000000
1시간 검색량 : 13.00 1일 검색량 : 13.00 주간 검색률 : 30.00 전체 검색량 : 30.00 점수 : 8.310000000000
1시간 검색량 : 1.00 1일 검색량 : 30.00 주간 검색률 : 30.00 전체 검색량 : 30.00 점수 : 8.550000000000

구현

구현 시나리오

인기 검색어 로직 요구사항

  1. 검색어 입력 요청이 오면 Redis 에 IP와 검색어를 함께 저장합니다. ( 중복으로 검색하여 실시간 검색어 랭킹을 조작하는 악용을 막기 위함 + 성능 최적화 )
  2. 매 시간마다 인기 검색어 조정
    2.1 Spring Scheduler 를 활용하여 한 시간마다 Redis에 있는 데이터들을 가져와 DB에 저장합니다. ( 이미 검색어가 존재한다면 검색 횟수 1 더하기 )
    2.2 모든 검색어 데이터들에 대해 위의 가중치 공식을 활용하여 점수를 계산하고 해당 검색어가 이전 랭킹과 얼마나 차이가 있는지 계산합니다. { 이때 Redis에 모든 데이터를 제거 합니다. }
  3. 매일 및 매주 검색 횟수를 초기화시켜 오랫동안 검색되지 않았을 경우 후순위로 밀리는 로직을 구현합니다.

검색어 가져오기 로직 구현

  1. 서버가 처음 시작될 때, 또는 매 정각에 모든 검색어들에 대한 점수를 계산하고 이전 랭킹과 얼마나 차이가 있는지 계산합니다. ( N랭킹 상승 및 하강 )
  2. 해당 점수와 검색어들을 우선순위 큐 에다가 보관합니다. ( 점수에 따른 내림차순 정렬 O ( NlogN ) )
  3. 매 인기 검색어 요청 시 해당 우선순위 큐를 활용해 결과 값을 도출 및 반환합니다.
    3.1 이때 우선순위 큐를 poll 할때 다른 큐에 복제 후 복제 큐에서 poll 합니다. ( 동일한 요청이 겹칠 경우 다른 결과를 도출할 수 있습니다. )

참고

참고 블로그 1 : https://seungjjun.tistory.com/283

profile
https://github.com/5tr1ker

0개의 댓글