검색 알고리즘 1차 개선안
Last updated
Last updated
기본적인 검색 알고리즘은 이전 항목의 "검색 알고리즘 설계"의 내용을 준수한다. 본 항목에서는 검색 결과 중, 우선도를 결정하는 스코어링 작업이 아닌, 스코어링 작업을 수행할 문서의 범위를 결정하는 조건 및 그 외에 검색 엔진의 퍼포먼스를 향상시킬 방안에 대하여 다룬다.
SOOJLE의 검색 알고리즘은 모든 문서에 대한 Full Table Scan을 최대한 지양하기 위해 학습 모델링에 사용된 명사 토큰과 검색 키워드 간의 매칭을 기반으로 각 문서의 중요도 점수를 작성한다. 실제로 정규 표현식을 통한 Full Table Scan에 비해 비약적으로 시간적 성능이 향상된 것을 확인할 수 있었고 해당 알고리즘의 큰 틀 자체는 변경될 여지가 크게 없다.
문제는 중요도 점수 작성을 하는 대상이 항상 Table의 문서 전체였다는 점이다. 하루에 평균 수천 개의 문서를 웹에서 수집하는 SOOJLE에 대하여 이 기능을 실행할 경우, 수집 용량에 따라 선형적으로 실행 시간이 증가하게 될 것이라는 문제점이 생긴다.
때문에 기존 문서 전체에 대한 점수 작성이 아닌, 선별된 일부의 데이터 목록 내에서만 각 문서에 대한 점수 작성을 수행할 필요가 있다.
기존의 검색 알고리즘은 Title Token, Tag, Token에 대하여 각각의 토큰이 매칭될 경우의 점수 우선순위를 부여하고 그 총합을 구해 최종 점수로 해당 문서의 중요도를 측정하였다.
해당 과정 중에, 우리들은 제목 > 태그 > 토큰 순으로 일치 여부에 따르는 중요도가 존재한다고 생각하였고 각 부분이 매칭될 때의 점수에 큰 폭의 차이를 두었다. 예를 들어 특정 제목, 혹은 본문 내용을 스크랩하여 검색했을 때, 검색한 제목 문자열와 완전히 똑같은 문서가 1순위로 뜨는 것이 당연하다고 생각했기 때문이다.
그러나 이 방식에도 몇 가지 문제점이 존재한다. 예를 들어 제목에는 "IT", "공모전"이라는 키워드가 존재하지 않지만 본문 내용 혹은 주제상 의미가 가까운 경우임에도, 고작 "IT" 키워드 하나가 제목에 일치한 (공모전과는 관련 없는) 게시물이 더 높은 우선순위를 받게 된다는 것이다.
위와 같은 이슈를 해결하기 위하여 팀원들과 검색 알고리즘을 개선할 아이디어를 논의해보았고 다음과 같은 개선 방안이 제시되었다.
기존의 SOOJLE 검색 엔진은 입력받은 검색 키워드를 기반으로 Title Token, Token, FastText Similar Token, 이 3가지의 토큰 리스트에 대하여 개별적으로 연속적인 작업을 수행한다. 때문에 충분히 병렬적으로 수행할 여지가 존재한다는 점이다. FrontEnd 단에서 각 API 3개를 비동기적으로 한 번에 호출함으로써 서버에서는 병렬적으로 각 과정을 수행할 수 있을 것이다.
사용자가 원하는 검색 결과는 검색 키워드에 따라 어떤 결과를 원하는지 다를 것이지만, 머신은 그에 따라 자동으로 분류하기가 힘들다. 예를 들어 그저 "공모전"이라는 키워드를 검색했을 때, 사용자는 공모전 모집 공고를 보고 싶을 수도 있고, 커뮤니티의 공모전 참여 후기를 원하는 것일 수도 있다.
때문에 각 게시물의 성격을 카테고리화하여 위와 같이 각 과정을 병렬화하여 먼저 나타난 검색 결과를 Client Side에서 먼저 표출해주는 것이다.
기존 검색 엔진의 스코어링 방식은 문제점은 다음과 같다.
해당 키워드의 성격으로 봤을때 사용자가 원하는 정보는 2번 문서에 가까웠지만 점수 책정 방식 때문에 1번 문서가 더 높은 점수를 받게 된다.
때문에 다음과 같은 검색 점수 책정 방식을 제안한다.
제목, 태그, 토큰 사이의 점수 차이를 줄인다.
제목, 태그, 토큰 중, 문서와 해당 부분 전체 혹은 일정 이상 비율이 일치할 경우, 추가 점수를 부여한다.