텍스트 분석
텍스트 분석 (Text Analysis)
전체 텍스트 검색이 제대로 동작하게 만드는 숨은 공정이 텍스트 분석이에요. 이메일 본문이나 제품 설명처럼 구조화되지 않은 텍스트를, 검색에 최적화된 구조로 변환하는 과정이죠. 덕분에 Elasticsearch는 정확히 일치하는 결과뿐 아니라 '관련 있는' 결과까지 돌려줄 수 있어요. 예를 들어 Quick fox jumps로 검색해도 A quick brown fox jumps over the lazy dog라는 문서가 나오죠.
토큰화 (Tokenization)
텍스트 분석의 핵심은 토큰화예요. 텍스트를 토큰이라는 더 작은 조각으로 쪼개는 과정이고, 대부분의 경우 토큰은 개별 단어예요. the quick brown fox jumps를 하나의 문자열로 그대로 색인하면 사용자가 quick fox로 검색해도 일치하지 않아요. 하지만 문구를 쪼개서 각 단어를 개별적으로 색인하면, quick fox는 물론 fox brown 같은 변형으로도 각 단어를 찾을 수 있죠.
토큰화는 개별 단어 단위 일치를 가능하게 하지만, 여전히 각 토큰은 그대로 일치해야 해요. 즉 문제가 남아요.
Quick으로 검색해도quick은 일치하지 않아요. (보통은 서로 일치하길 원하죠.)fox와foxes는 어근이 같아도,foxes검색은fox에 일치하지 않아요.jumps검색은leaps에 일치하지 않아요. 어근은 달라도 동의어이고 뜻이 비슷하죠.
정규화 (Normalization)
이런 문제를 해결하기 위해 텍스트 분석은 토큰을 표준 형식으로 정규화해요. 그래서 검색어와 정확히 같지 않아도 비슷해서 관련 있는 토큰끼리 일치시킬 수 있어요.
Quick을 소문자로 만들어quick으로 만들 수 있어요.foxes를 어간 추출(stemming)해 어근인fox로 줄일 수 있어요.jump와leap은 동의어라 하나의 단어인jump로 색인할 수 있어요.
검색어도 같은 토큰화·정규화 규칙을 적용하면, Foxes leap 검색이 fox jump 검색으로 정규화되어 원하는 단어와 일치해요.
분석기 (Analyzer)
이 전체 과정을 한데 묶는 규칙 집합이 분석기(analyzer) 예요. Elasticsearch는 기본 제공되는 standard analyzer를 포함해 대부분의 사용 사례에 바로 잘 맞는 기본값을 갖고 있어요. 검색 경험을 맞춤 조율하고 싶다면 다른 내장 분석기를 고르거나, 커스텀 분석기를 만들 수도 있어요.
커스텀 분석기는 분석의 각 단계를 제어해요.
- 토큰화 전 텍스트에 가하는 변경
- 텍스트가 토큰으로 변환되는 방식
- 색인·검색 전 토큰에 가하는 정규화 변경
분석기의 구성 요소
분석기는 — 내장이든 커스텀이든 — 세 가지 하위 구성 요소를 담은 패키지예요. 이 세 조각의 조합이 분석기 전체를 결정해요.
- 문자 필터(Character filters) — 0개 이상을 순서대로 적용해요. 토큰화 전에 텍스트를 바꿔요.
- 토크나이저(Tokenizer) — 정확히 1개만 가져요. 문자 스트림을 받아 개별 토큰(보통 단어)으로 쪼개고 토큰 스트림을 출력해요.
whitespace토크나이저는 공백이 보일 때마다 텍스트를 나누죠. - 토큰 필터(Token filters) — 0개 이상을 순서대로 적용해요. 토큰 스트림을 받아 토큰을 추가·제거·변경해요.
lowercase필터는 전부 소문자로 바꾸고,stop필터는the같은 흔한 단어(불용어)를 제거하며,synonym필터는 동의어를 토큰 스트림에 넣어줘요. 토큰 필터는 각 토큰의 위치나 문자 오프셋을 바꾸지 못해요.
내장 분석기는 이 구성 요소들을 언어와 텍스트 유형에 맞게 미리 조합해 둔 것이고, Elasticsearch는 각 구성 요소를 개별적으로도 노출해서 새 custom 분석기를 조립할 수 있게 해 줘요.