검색 엔진 Search/Elastic Search

[Basic] Elasticsearch 인덱스(Index) 구성하기 (2)

오늘은 지난 글에 이어서, 인덱스를 구성하기 위한 요소들에 대해 알아봅시다.

 

지난 글에서는 인덱스 샤드 수, 레플리카 수 등 일반적인 설정을 정의할 수 있는 Settings와 각 필드의 속성과 전체적인 스키마를 정의하는 Mappings에 관해 알아봤습니다.

 

오늘은 나머지 2가지, 문자열 필드의 분석기 등을 설정하는 Analysis 검색 시의 유사도를 정의하는 Similarity에 대해 추가로 알아보겠습니다.

 

Elasticsearch 시리즈는 7.10 버전을 기본으로 설명합니다. 필요하다면 8.0 이후의 버전 내용을 추가로 설명합니다.

 

분석(Analysis

 

인덱스 분석 모듈은 문자열 필드를 개별 용어(term)로 변환하는 데 사용할 수 있는 분석기를 구성하도록 하는 레지스트리 역할을 합니다.

텍스트 분석은 이메일 본문이나 제품 설명과 같은 비정형 텍스트를 검색에 최적화된 정형 형식으로 변환하는 프로세스입니다.

 

ES는 전체 텍스트 검색을 수행할 수 있으며, 검색은 정확히 일치하는 결과만 반환하는 것이 아니라 모든 관련 결과를 반환합니다.

예를 들어, "어린 왕자와 빨간 여우"를 검색한 경우, "어린 왕자와 여우", "왕자와 여우", "빨간 여우" 등 정확히 일치하지 않아도 관련된 여러 문서가 반환될 수 있습니다.

 

이러한 검색을 위해 텍스트 필드 타입을 가지는 필드에 대해서는 인덱스 생성 단계에서 미리 분석기 관련 설정도 함께 정의해야 합니다.

 

매핑 단계에서 텍스트 필드를 정의하지 않았다면, 해당 모듈을 정의하지 않아도 됩니다.

하지만, 검색 엔진을 구축하는 경우, 비정형 데이터 마이닝을 위해 인덱스를 구성하는 경우, 특정 언어에 대한 파인 튜닝된 검색이 필요한 경우 등 반드시 인덱스 분석 모듈을 고려해야 하는 케이스가 있습니다.

 

텍스트 분석은 분석기에 의해 수행되며, ES에는 standard analyzer라고 하는 기본 분석기가 포함되어 있습니다. 

그러나, 한국어에 대해 기본 분석기로는 nori tokenizer를 이용한 사용자 정의 분석기(custom analyzer)를 보통 사용합니다.

 

사용자 정의 분석기를 사용할 때, 다음과 같은 분석 프로세스의 각 단계를 제어할 수 있습니다.

  • 토큰화 전 텍스트 변경 사항 (예: 특정 한자를 한글로 변경합니다)
  • 텍스트가 토큰으로 변환되는 방법
  • 인덱싱 또는 검색 전에 토큰에 대한 정규화 적용 사항

 

정리하자면, 인덱스 모듈을 이용해 텍스트 타입 필드에 대해 인덱싱이나 검색 단계에서 사용할 분석기를 인덱스 단위로 설정합니다.

 

유사도(Similarity)

 

유사도(점수/순위 모델)는 일치하는 문서에 점수를 매기는 방법을 정의합니다. 

인덱스 정의 시, 디폴트 유사도를 설정하고, 매핑을 통해 필드별로 다른 유사도를 정의할 수도 있습니다.

유사도는 주로 텍스트 필드에 유용하지만 다른 필드 유형에도 적용할 수 있습니다.

 

기본 제공 유사도의 매개변수를 조정하여 사용자 정의 유사도를 구성할 수 있습니다.

*ES에서는 사용자 정의 유사도를 구성하지 않아도, 기본 제공 유사도만으로도 충분히 검색 엔진을 구성할 수 있다고 말합니다.

추가로 사용자 정의 설정 없이 바로 사용할 수 있는 유일한 유사도는 다음과 같습니다.

  • BM25 similarity (default) : Okapi BM25 알고리즘으로, ES와 Lucene에서 기본적으로 사용되는 알고리즘입니다.
  • boolean : 전체 텍스트 순위가 필요하지 않고 쿼리 용어가 일치하는지 여부만을 기준으로 점수를 매겨야 할 때 사용되는 간단한 유사도입니다.


이 외에도 Scripted Similarity로 스크립트를 사용하여 점수 계산 방법을 지정할 수 있습니다. 예를 들어, TF-IDF를 스크립트로 구현하여 유사도로 사용할 수 있습니다.

 

 

마무리

이번 글에서는 인덱스를 정의할 때 사용되는 대표적인 세부 요소 4가지 중 Analysis와 Similarity를 알아보았습니다.

 

지난 글부터 이번 글까지, 인덱스 구성 요소에 대해 간략하게 설명해드렸는데요!

다음 글에는 실제로 간단한 스키마를 가진 인덱스를 ES API를 통해 직접 정의하면서 CRUD를 연습해보겠습니다.

예시를 통해 지금까지 살펴본 구성 요소를 다시 상기시키며, 엘라스틱서치의 인덱스 구축 단계에 대해 감을 잡을 수 있을 거에요!

그럼, 다음 글에서 이어서 뵙겠습니다. 😊