텍스트 분석 (Text Analysis)

텍스트 분석 (Text Analysis)

*텍스트 분석(text analysis)*은 이메일 본문이나 상품 설명처럼 구조화되지 않은(unstructured) 텍스트를, 검색에 최적화된 구조화된 형식으로 바꾸는 과정이에요.

텍스트 분석 덕분에 Elasticsearch는 전체 텍스트 검색(full-text search)을 수행할 수 있어요. 이때 검색은 정확히 일치하는 결과만 돌려주는 대신, 관련성 있는 결과를 모두 돌려줍니다. 예를 들어 Quick fox jumps를 검색하면, A quick brown fox jumps over the lazy dog가 들어 있는 문서를 찾아주고 싶을 거예요. 나아가 fast foxfoxes leap처럼 뜻이 통하는 단어가 든 문서도 함께 찾아주면 더 좋겠죠.

Elasticsearch는 text 필드를 인덱싱하거나 검색할 때 텍스트 분석을 수행해요. 인덱스에 text 필드가 없다면 추가 설정은 필요 없고, 이 섹션의 페이지를 건너뛰어도 됩니다. 반대로 text 필드를 쓰고 있거나 텍스트 검색이 기대처럼 결과를 못 돌려주고 있다면, 텍스트 분석을 구성하는 게 자주 도움이 돼요. Elasticsearch를 이런 목적으로 쓰고 있다면 분석 설정을 살펴볼 만해요.

  • 검색 엔진을 구축할 때
  • 비구조화 데이터를 마이닝할 때
  • 특정 언어에 맞게 검색을 세밀하게 조정할 때
  • 사전식(lexicographic) 또는 언어학적 연구를 수행할 때

분석이 전체 텍스트 검색을 가능하게 만드는 핵심은 *토큰화(tokenization)*예요. 텍스트를 *토큰(token)*이라는 더 작은 조각으로 쪼개는 과정인데, 대부분의 경우 이 토큰은 개별 단어입니다.

the quick brown fox jumps라는 문구를 단일 문자열로 인덱싱하고 사용자가 quick fox를 검색했다고 해볼게요. 이 경우에는 일치로 취급되지 않아요. 하지만 문구를 토큰화해서 각 단어를 따로 인덱싱하면, 쿼리 문자열의 용어를 개별적으로 찾아볼 수 있어요. 그래서 quick fox, fox brown, 그 외 다양한 조합으로 검색해도 매칭될 수 있습니다.

토큰화는 개별 용어 매칭을 가능하게 하지만, 각 토큰은 여전히 문자 그대로(literally) 매칭돼요. 그 뜻은 이렇습니다.

  • Quick을 검색해도 quick과는 매칭되지 않아요. 두 용어가 서로 매칭되길 원하겠지만요.
  • foxfoxes는 어근이 같지만, foxes를 검색해도 fox와 매칭되지 않고 그 반대도 마찬가지예요.
  • jumps를 검색해도 leaps와 매칭되지 않아요. 두 단어는 어근이 같지는 않지만 동의어라서 의미가 비슷하죠.

이런 문제를 해결하기 위해 텍스트 분석은 토큰을 *정규화(normalize)*해서 표준 형식으로 만들 수 있어요. 그러면 검색어와 정확히 같지는 않지만 관련성 있는 정도로 비슷한 토큰도 매칭할 수 있습니다. 예를 들면요.

  • Quick은 소문자로 바꿔 quick으로 만들 수 있어요.
  • foxes는 *어간 추출(stemmed)*해서 어근 fox로 줄일 수 있어요.
  • jumpleap은 동의어라서 jump라는 단일 단어로 인덱싱할 수 있어요.

검색어가 의도한 대로 이 단어들과 매칭되도록, 쿼리 문자열에도 같은 토큰화·정규화 규칙을 적용하면 됩니다. 예를 들어 Foxes leap를 검색하면 fox jump를 검색하는 것으로 정규화할 수 있어요.

텍스트 분석은 애널라이저(analyzer)가 수행합니다. 애널라이저는 이 전체 과정을 관장하는 규칙의 묶음이에요.

Elasticsearch는 기본 애널라이저인 표준 애널라이저(standard analyzer)를 내장하고 있는데, 대부분의 사용 사례에서 별다른 설정 없이 바로 잘 작동해요.

검색 경험을 직접 다듬고 싶다면 다른 내장 애널라이저(analyzer reference)를 고르거나, 커스텀 애널라이저를 구성할 수도 있습니다. 커스텀 애널라이저를 쓰면 분석 과정의 각 단계를 직접 제어할 수 있어요. 예를 들어 다음과 같은 것들을요.

  • 토큰화 이전에 텍스트에 가하는 변경
  • 텍스트를 토큰으로 변환하는 방식
  • 인덱싱 또는 검색 전에 토큰에 적용하는 정규화 변경