구글이 검색을 하는 법

bovev31844·2023년 10월 28일
0
post-thumbnail

서론

구글링을 하던 중, 수많은 데이터 중에서 어떻게 검색어를 빠르게 찾을 수 있는지 궁금증이 생겨 찾아보았습니다. 구글의 검색 기능은 복잡한 알고리즘이 효과적으로 적용되어 있겠지만, 그중 텍스트 색인화 기능을 Elastic Search를 통해 알아보겠습니다.

⚠️ 이 글은 Elastic Search의 가이드가 아닌, 텍스트 색인화에 대한 포스트입니다.
👉 Elastic Search 설치 및 사용법은 해당 글을 참고해주시면 감사하겠습니다.

ES(Elastic Search)는 Full Text Search(전문검색) 기능과 점수 기반의 다양한 정확도 알고리즘, 실시간 분석 등을 제공하는 오픈소스 프로젝트입니다.

데이터 저장 방식

일반적으로 Oracle이나 MySQL 같은 관계형 데이터베이스는 위와 같이 테이블 구조로 데이터를 저장합니다. 그렇기 때문에 'fox'를 찾으려면 모든 줄을 돌아가며 'fox'가 포함된 행들을 가져올 것입니다. 이것은 O(N*K)의 시간 복잡도를 가지기 때문에 데이터가 늘어날 때마다 속도가 느려집니다.

ES는 위의 단점을 보완하기 위해 역 인덱스(Inverted Index)라는 구조를 만들어 저장합니다. 역 인덱스는 문장에서 추출된 키워드(Term)를 기준으로 포함된 문장의 ID를 저장합니다. 이렇게 역 인덱스가 있으면 키워드를 포함하고 있는 문서들의 Id를 바로 얻어올 수 있습니다. 이런 방식은 O(1)의 시간 복잡도를 가지기 때문에 데이터가 늘어나더라도 빠른 속도의 검색이 가능합니다.

텍스트 분석

ES는 문자열 필드를 저장하거나 검색하기 전 여러 가지 처리 과정을 거치게 됩니다. 이 과정을 애널라이저(Analizer)라고 합니다.

애널라이저는 0~3개의 캐릭터 필터(Character Filter), 1개의 토크나이저(Tokenizer), 0~n개의 토큰필터(Token Filter)로 구성됩니다.

1. 캐릭터 필터

캐릭터 필터는 텍스트 분석 중 가장 먼저 처리되는 과정으로, 전체 문장에서 특정 문자를 대체하거나 삭제하는 과정을 담당하는 필터입니다. 7.0 버전 기준으로 캐릭터 필터는 HTML Strip, Mapping, Pattern Replace 총 3개가 존재합니다.

2. 토크나이저

토크나이저는 문장에 속한 단어들을 텀 단위로 하나씩 분리해내는 과정입니다. 토크나이저는 반드시 1개만 적용이 가능합니다.

3. 토큰필터

토큰 필터는 분리된 텀들을 하나씩 가공하는 기능입니다. 토큰 필터는 0개부터 여러개까지 적용할 수 있습니다.

여기서는 먼저 Lowercase 토큰 필터를 이용해서 대문자를 소문자로 바꿔줍니다. 이렇게 하면 대소문자 구별 없이 검색이 가능하게 됩니다. 대소문자가 일치하게 되어 같은 텀이 된 토큰들은 모두 하나로 병합이 됩니다.

이제 역 인덱스는 위와 같이 변경됩니다.


마치며

이제 대용량 데이터에서 원하는 정보를 아주 빠르게 찾을 수 있게 되었습니다. 또한 관계형 데이터베이스에서 LIKE를 이용해 검색어를 찾는 게 얼마나 비효율적이라는 것도 알게 되었습니다. 다음 프로젝트에서 검색 기능을 구현해야 한다면 LIKE 대신 Full Text Search는 어떨까요?

참고

Elastic 공식 Blog
Elastic 가이드 북

0개의 댓글