# 검색 알고리즘  1차 개선안

## 개요

기본적인 검색 알고리즘은 이전 항목의 "검색 알고리즘 설계"의 내용을 준수한다. 본 항목에서는 검색 결과 중, 우선도를 결정하는 스코어링 작업이 아닌, 스코어링 작업을 수행할 문서의 범위를 결정하는 조건 및 그 외에 검색 엔진의 퍼포먼스를 향상시킬 방안에 대하여 다룬다.

## 기존 방법의 문제점

![](https://728901758-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-L_Wo7SRUvbKJuPojzzZ%2F-LtXAw0PRtuAUj8m-4dd%2F-LtXDXLTJPGutTPtZ9ok%2Fimage.png?alt=media\&token=5782b41d-ea87-416c-b8f5-e7808959b492)

### 문서 증가에 따르는 검색 모듈 성능 하락

SOOJLE의 검색 알고리즘은 모든 문서에 대한 **Full Table Scan을 최대한 지양하기 위해** 학습 모델링에 사용된 명사 토큰과 검색 키워드 간의 매칭을 기반으로 각 문서의 중요도 점수를 작성한다. 실제로 정규 표현식을 통한 Full Table Scan에 비해 비약적으로 시간적 성능이 향상된 것을 확인할 수 있었고 해당 알고리즘의 큰 틀 자체는 변경될 여지가 크게 없다.

문제는 중요도 점수 작성을 하는 대상이 항상 Table의 문서 전체였다는 점이다. 하루에 평균 수천 개의 문서를 웹에서 수집하는 SOOJLE에 대하여 이 기능을 실행할 경우, 수집 용량에 따라 선형적으로 실행 시간이 증가하게 될 것이라는 문제점이 생긴다.

때문에 기존 문서 전체에 대한 점수 작성이 아닌, 선별된 일부의 데이터 목록 내에서만 각 문서에 대한 점수 작성을 수행할 필요가 있다.&#x20;

### 토큰 일치 여부에 따르는 점수 분배 방식

기존의 검색 알고리즘은 **Title Token, Tag, Token**에 대하여 각각의 토큰이 매칭될 경우의 점수 우선순위를 부여하고 그 총합을 구해 최종 점수로 해당 문서의 중요도를 측정하였다.

해당 과정 중에, 우리들은 **제목 > 태그 > 토큰** 순으로 일치 여부에 따르는 중요도가 존재한다고 생각하였고 각 부분이 매칭될 때의 점수에 큰 폭의 차이를 두었다. 예를 들어 특정 제목, 혹은 본문 내용을 스크랩하여 검색했을 때, 검색한 제목 문자열와 완전히 똑같은 문서가 1순위로 뜨는 것이 당연하다고 생각했기 때문이다. &#x20;

그러나 이 방식에도 몇 가지 문제점이 존재한다. 예를 들어 제목에는 "IT", "공모전"이라는 키워드가 존재하지 않지만 본문 내용 혹은 주제상 의미가 가까운 경우임에도, 고작 "IT" 키워드 하나가 제목에 일치한 (공모전과는 관련 없는) 게시물이 더 높은 우선순위를 받게 된다는 것이다.&#x20;

## 검색 모듈 개선안

위와 같은 이슈를 해결하기 위하여 팀원들과 검색 알고리즘을 개선할 아이디어를 논의해보았고 다음과 같은 개선 방안이 제시되었다.

### 검색 엔진 수행 병렬화

![](https://728901758-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-L_Wo7SRUvbKJuPojzzZ%2F-LtZKcNn7LW52BZgLFCi%2F-LtZLKrLDItt_w9xyo8L%2Fimage.png?alt=media\&token=632c41e6-4e34-4c75-9501-5f243073d7e1)

기존의 SOOJLE 검색 엔진은 입력받은 검색 키워드를 기반으로  **Title Token, Token, FastText Similar Token,** 이 3가지의 토큰 리스트에 대하여 개별적으로 연속적인 작업을 수행한다. 때문에 충분히 병렬적으로 수행할 여지가 존재한다는 점이다. FrontEnd 단에서 각 API 3개를 비동기적으로 한 번에 호출함으로써 서버에서는 병렬적으로 각 과정을 수행할 수 있을 것이다.

### 검색 결과 카테고리 분류 및 중간 출력

사용자가 원하는 검색 결과는 검색 키워드에 따라 어떤 결과를 원하는지 다를 것이지만, 머신은 그에 따라 자동으로 분류하기가 힘들다. 예를 들어 그저 **"공모전"**&#xC774;라는 키워드를 검색했을 때, 사용자는 **공모전 모집 공고**를 보고 싶을 수도 있고, 커뮤니티의 **공모전 참여 후기**를 원하는 것일 수도 있다.&#x20;

때문에 각 게시물의 성격을 카테고리화하여 위와 같이 각 과정을 병렬화하여  먼저 나타난 검색 결과를 Client Side에서 먼저 표출해주는 것이다.&#x20;

### 제목,  태그, 토큰 간의 점수 측정 방식 수정

기존 검색 엔진의 스코어링 방식은 문제점은 다음과 같다.

```coffeescript
Keyword : IT 공모전

Document1 : IT 부문 프로그래머 채용 공고
Document2 : SW 경진대회 모집 공고

Score(Document1) > Score(Document2)
```

해당 키워드의 성격으로 봤을때 사용자가 원하는 정보는 2번 문서에 가까웠지만 점수 책정 방식 때문에 1번 문서가 더 높은 점수를 받게 된다.

때문에 다음과 같은 검색 점수 책정 방식을 제안한다.

* 제목,  태그, 토큰 사이의 점수 차이를 줄인다.
* 제목, 태그, 토큰 중, 문서와 해당 부분 전체 혹은 일정 이상 비율이 일치할 경우, 추가 점수를 부여한다.
