////
Search
Duplicate
💹

13장. 검색어 자동완성 시스템

검색어 자동완성은 많은 제품에 중요하게 사용되는 기능으로 이번 장에서는 많이 사용된 검색어 k개를 자동완성하여 출력하는 시스템을 설계해보겠다.

1단계 문제 이해 및 설계 범위 확정

검색어 자동완성 서비스를 제공하기 위해 다음과 같은 질문들을 해볼수 있다.
사용자가 입력하는 단어는 자동완성되는 단어의 어느 부분에 해당하는가?
몇 개의 자동완성 검색어가 표시되어야 하는가?
그 몇 개를 고르는 기준은 무엇인가?
맞춤법 검사 기능도 제공해야 하는가?
질의는 무슨 언어를 지원해야 하는가?
특수 문자도 처리를 해주어야 하는가?
얼마나 많은 사용자를 지원해야 하는가?

요구사항

이번 예제에서는 다음과 같은 요구사항을 전제로 시스템을 설계한다고 가정하자.
빠른 응답 속도 : 사용자가 검색어를 입력함에 따라 자동완성 검색어도 충분히 빨리 표시되어야 한다.
연관성 : 자동완성되어 출력되는 검색어는 사용자가 입력한 단어와 연관되어야 한다.
정렬 : 시스템의 계산 결과는 인기도 등의 순위 모델에 의해 정렬되어야 한다.
규모 확장성 : 시스템은 많은 트래픽을 감당할 수 있도록 확장 가능해야 한다.
고가용성 : 시스템의 일부에 장애가 발생하거나 느려지거나, 예상치 못한 네트워크 문제가 생겨도 시스템은 사용 가능해야 한다.

개략적 규모 추정

DAU는 천만 명이라고 가정한다.
평균적으로 한 사용자는 대략 10회의 검색을 수행한다고 가정하자.
질의할 때마다 평균적으로 20바이트의 데이터를 입력한다고 가정한다.
인코딩 방식으로는 ASCII를 사용한다고 가정해볼 수 있다.
질의문은 평균적으로 4개 단어로 이루어진다고 가정할 것이며, 각 단어는 평균적으로 5글자로 구성된다고 가정한다.
검색창에 글자를 입력할 때마다 클라이언트는 검색어 자동완성 시스템에 요청을 보낸다.
따라서 평균적으로 1회 검색당 20건의 요청이 발생한다.
따라서 대략 초당 24,000 건의 질의가 발생할 것이다.
기존 검색어를 바탕으로 자동완성을 지원하므로 신규 검색어 역시 존재할 수 있다.
여기선 질의 가운데 대략 20% 정도를 신규 검색어라고 가정한다.

2단계 개략적 설계안 제시 및 동의 구하기

개략적으로 보면 시스템은 두 부분으로 나뉜다.
데이터 수집 서비스 : 사용자가 입력한 질의를 실시간으로 수집하는 시스템이다.
질의 서비스 : 주어진 질의에 대해서 다섯 개의 인기 검색어를 정렬하여 반환한다.

데이터 수집 서비스

질의문과 사용빈도를 함께 저장하는 빈도 테이블을 만들어 사용할 수 있다.
해당 시스템은 질의에 따라 해당 단어의 빈도를 1씩 상승시킬 것이다.

질의 서비스

검색 빈도에 따라 데이터를 정렬하므로 특정 단어로 시작하는 쿼리문을 사용한다.

3단계 상세 설계

상세히 설계를 위해 다음 내용들을 고려해볼 수 있다.
트라이 자료구조
접두어 최대 길이 제한
노드에 인기 검색어 캐시
데이터 수집 서비스
데이터 분석 서비스 로그
로그 취합 서버
취합된 데이터
작업 서버
트라이 캐시
트라이 데이터베이스
질의 서비스
트라이 연산
트라이 생성
트라이 갱신
검색어 삭제
저장소 규모 확장

4단계 마무리

설계 후, 추가적으로 고민해볼 수 있는 사항들은 다음과 같다.
다국어 지원
국가별 인기 검색어 순위
실시간으로 변하는 검색어의 추이를 반영