검색 엔진 원리
서론
타오바오에서 "빨간 원피스"를 검색하면, 0.1초 만에 수십억 개의 상품 중에서 가장 관련성 높은 결과를 찾아줍니다 -- 이것이 어떻게 가능한 걸까? 검색 엔진은 인터넷의 가장 핵심적인 인프라 중 하나입니다. Google부터 이커머스 사내 검색까지, 핵심 원리는 모두 같습니다: 역색인 + 관련성 정렬.
이 글에서 배울 내용
이 장을 마치면 다음을 얻게 됩니다:
- 역색인: 검색 엔진의 가장 핵심적인 데이터 구조 이해
- 형태소 분석 기술: 한국어/중국어 형태소 분석의 과제와 일반적인 해결 방안 이해
- 관련성 정렬: TF-IDF와 BM25의 기본 원리 파악
- Elasticsearch: 가장 인기 있는 검색 엔진의 아키텍처와 사용 시나리오 이해
- 검색 최적화: 동의어, 오타 교정, 하이라이트 등 실용적인 검색 기능 파악
| 장 | 내용 | 핵심 개념 |
|---|---|---|
| 제 1장 | 역색인 | 정방향 색인 vs 역색인 |
| 제 2장 | 형태소 분석과 텍스트 분석 | 한국어/중국어 형태소 분석, 불용어, 어간 추출 |
| 제 3장 | 관련성 정렬 | TF-IDF, BM25 |
| 제 4장 | Elasticsearch | 분산 아키텍처, 샤드, 복제본 |
| 제 5장 | 검색 최적화 | 동의어, 오타 교정, 자동 완성 |
0. 전경도: 검색의 본질은 무엇인가?
검색의 본질은 정보 검색(Information Retrieval) 문제입니다: 주어진 질의에 대해 방대한 문서에서 가장 관련성 높은 결과를 찾아 관련성 순으로 정렬하여 반환합니다.
이 과정은 두 단계로 나뉩니다:
- 색인 단계(오프라인): 미리 모든 문서를 처리하여 효율적인 검색 구조를 구축
- 질의 단계(온라인): 사용자가 키워드를 입력하면 빠르게 일치하는 문서를 찾아 정렬
왜 데이터베이스 LIKE 쿼리를 사용할 수 없나요?
SELECT * FROM products WHERE name LIKE '%红色连衣裙%'는 검색이 가능해 보이지만, 풀 테이블 스캔이 필요합니다 -- 모든 레코드를 하나씩 검사해야 합니다. 데이터가 수백만 건에 달하면 이 쿼리는 사용이 불가능할 정도로 느려집니다. 역색인은 이 O(n) 연산을 O(1) 조회로 변환합니다.
1. 역색인: 검색 엔진의 "심장"
전통적인 데이터베이스는 정방향 색인을 사용합니다: 문서 ID에서 문서 내용을 찾습니다. 검색 엔진은 역색인을 사용합니다: 키워드에서 해당 키워드를 포함하는 문서 목록을 찾습니다.
| 색인 유형 | 방향 | 검색 방식 | 적용 시나리오 |
|---|---|---|---|
| 정방향 색인 | 문서 -> 내용 | ID를 알고 내용을 조회 | 데이터베이스 기본키 조회 |
| 역색인 | 키워드 -> 문서 목록 | 키워드를 알고 문서를 조회 | 전문 검색 |
역색인 구축 과정
- 문서 수집: 검색 대상이 되는 모든 문서 획득
- 형태소 분석(Tokenization): 문서를 개별 단어로 분할
- 매핑 구축: 각 단어가 어떤 문서에 나타나는지 기록 (위치, 빈도 등 포함)
- 영속 저장: 색인을 디스크에 기록하여 빠른 조회 지원
2. 형태소 분석과 텍스트 분석
형태소 분석은 검색 엔진의 첫 번째 단계이자, 한국어/중국어 검색의 가장 큰 과제입니다. 영어는 자연스럽게 공백으로 단어가 구분되지만, 한국어와 중국어에는 구분자가 없습니다 -- "탁구채팔았어"는 "탁구/채/팔았어" 또는 "탁구채/팔았어"로 분석될 수 있습니다.
| 분석 방식 | 설명 | 예시 |
|---|---|---|
| 표준 분석 | 공백과 구두점으로 분할 (영어) | "hello world" -> ["hello", "world"] |
| 한국어/중국어 형태소 분석 | 사전 또는 모델 기반 분할 | "검색엔진" -> ["검색", "엔진"] |
| N-gram | 고정 길이 슬라이딩 윈도우로 분할 | "검색" -> ["검색", "색인"] |
| 커스텀 사전 | 비즈니스 전용 용어 추가 | "iPhone16ProMax"를 하나의 단어로 처리 |
텍스트 분석 파이프라인
형태소 분석은 텍스트 분석의 한 단계일 뿐입니다. 전체 파이프라인에는 다음이 포함됩니다:
- 문자 필터링: HTML 태그, 특수문자 제거
- 형태소 분석: 텍스트를 단어(Token)로 분할
- 불용어 필터링: "의", "는", "이" 등 의미 없는 고빈도어 제거
- 동의어 확장: "휴대폰"을 "휴대폰, 핸드폰, 스마트폰"으로 확장
- 어간 추출: "running"을 "run"으로 복원 (영어)
3. 관련성 정렬: 어떤 결과가 가장 "관련성"이 높은가?
일치하는 문서를 찾는 것은 첫 번째 단계일 뿐이며, 더 중요한 것은 정렬 -- 가장 관련성 높은 결과를 가장 위에 배치하는 것입니다.
| 알고리즘 | 원리 | 특징 |
|---|---|---|
| TF-IDF | 단어 빈도(TF) x 역문서 빈도(IDF) | 고전 알고리즘, 간단하고 효과적 |
| BM25 | TF-IDF의 개선판, 문서 길이 정규화 추가 | Elasticsearch 기본 알고리즘 |
| 벡터 검색 | 문서와 질의를 벡터로 변환, 코사인 유사도 계산 | 시맨틱 검색 지원 |
TF-IDF 직관적 이해
- TF(단어 빈도): 단어가 문서에 많이 나타날수록 해당 문서가 그 단어와 관련성이 높을 가능성이 큼
- IDF(역문서 빈도): 단어가 적은 수의 문서에만 나타날수록 구별력이 높음
- "의"는 모든 문서에 나타남 (IDF 낮음), "의"를 검색하는 것은 의미 없음
- "Elasticsearch"는 소수의 문서에만 나타남 (IDF 높음), 검색하면 정확히 찾을 수 있음
4. Elasticsearch: 가장 인기 있는 검색 엔진
Elasticsearch는 현재 가장 인기 있는 오픈소스 검색 엔진으로, Apache Lucene을 기반으로 구축되었으며, 분산 RESTful API 기반의 전문 검색 기능을 제공합니다.
| 개념 | 설명 |
|---|---|
| Index | 데이터베이스의 "테이블"과 유사, 동일한 유형의 문서 저장 |
| Document | 하나의 레코드, JSON 형식 |
| Shard | 샤드, 인덱스를 여러 노드에 분할 |
| Replica | 복제본, 고가용성과 읽기 확장 제공 |
| Mapping | 필드 타입 정의, 데이터베이스 Schema와 유사 |
| Analyzer | 텍스트 분석기, 형태소 분석 규칙 정의 |
ES vs 데이터베이스
Elasticsearch는 데이터베이스를 대체하는 것이 아니라 검색 계층으로 데이터베이스와 함께 사용됩니다. 전형적인 아키텍처: 데이터를 데이터베이스에 기록 -> ES에 동기화 -> 검색 요청은 ES로 처리 -> 상세 요청은 데이터베이스로 처리
5. 검색 최적화: 검색을 더 "똑똑하게"
| 최적화 수단 | 설명 | 효과 |
|---|---|---|
| 동의어 | "휴대폰"으로 "핸드폰"도 검색 가능 | 재현율 향상 |
| 맞춤법 교정 | "iphoen"을 "iphone"으로 자동 교정 | 오타 허용 |
| 자동 완성 | "사" 입력 시 "사과폰" 추천 | 경험 향상 |
| 하이라이트 | 검색 결과에서 일치하는 단어를 빨간색으로 표시 | 직관적 표시 |
| 가중치 조정 | 제목 일치 가중치 > 내용 일치 가중치 | 정확도 향상 |
| 필터 및 집계 | 가격 범위, 브랜드별 필터링 | 범위 축소 |
요약
검색 엔진은 인터넷 애플리케이션의 핵심 인프라입니다. 역색인, 형태소 분석, 관련성 정렬이라는 세 가지 핵심 개념을 이해하면 검색 엔진의 본질을 파악한 것입니다.
이 장의 핵심 포인트를 되돌아보세요:
- 역색인: 키워드에서 문서로의 역방향 매핑, 검색 엔진의 핵심 데이터 구조
- 형태소 분석이 기초: 한국어/중국어 형태소 분석은 검색 품질의 핵심, 적절한 분석기 선택 필요
- BM25 정렬: 단어 빈도와 문서 빈도를 기반으로 한 관련성 점수, ES의 기본 알고리즘
- ES 아키텍처: 샤드 + 복제본으로 분산 및 고가용성 구현
- 검색 최적화: 동의어, 오타 교정, 자동 완성으로 검색을 더 스마트하게
더 읽어보기
- Elasticsearch 공식 문서 - 가장 권위 있는 ES 참고 자료
- Elasticsearch 확실한 가이드 - 한국어/중국어 입문 가이드
- Apache Lucene - ES의 기반이 되는 검색 엔진 라이브러리
- MeiliSearch - 경량급 검색 엔진, 중소 프로젝트에 적합
- Typesense - 오픈소스 즉시 검색 엔진