검색 엔진 Search/Elastic Search

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

 

검색 엔진을 구축하기 위해서 가장 먼저 필요한 것은 무엇일까요?

검색 대상이 되는 도큐먼트(Document)가 들어갈 수 있는 DB 같은 공간을 만들어야겠죠?

 

이번 글의 목표는 도큐먼트의 집합인 인덱스(Index)를 구성하는 요소를 이해하고,

예제를 통해 직접 인덱스를 정의하면서 ES에서 사용하는 기본적인 CRUD 방식에 익숙해지는 것 입니다.

 

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

 

인덱스 구성 요소

인덱스 모듈은 인덱스별로 생성되는 모듈로 인덱스와 관련된 모든 측면을 제어합니다.

 

일반적으로 인덱스를 정의할 때 사용되는 세부 모듈은 간략하게 다음과 같습니다.

- 인덱스 샤드 수, 레플리카 수 등 일반적인 설정을 정의할 수 있는 Settings

- 각 필드의 속성과 전체적인 스키마를 정의하는 Mappings

- 문자열 필드의 분석기 등을 설정하는 Analysis

- 검색 시의 유사도를 정의하는 Similarity

 

위 4가지가 대표적인 인덱스 생성 시 고려할 수 있는 구성 요소이며, 앞으로 각각의 요소를 더 자세히 이해해봅시다!

 

설정(Settings)

인덱스 일반 설정들을 의미합니다.

 

샤드, 레플리카 수 설정, 별칭 정의 등이 일반 설정에 속하며, 일반 설정 요소 중에서도 static 요소들과 dynamic 요소로 구분할 수 있습니다.

dynamic 설정들은 인덱스를 생성한 이후에도 설정을 업데이트할 수 있습니다.

 

가장 대표적인 예로, 샤드 수는 static 요소로 인덱스 정의시 정한 샤드의 수는 불변합니다.

반면, 레플리카 수는 dynamic 한 설정으로, 기존에 1로 설정하여 인덱스를 생성했다 하더라도, 인덱스 운영 중에 레플리카가 추가로 필요하면 2로 변경 가능합니다.

 

 

매핑(Mappings)

매핑은 문서와 문서에 포함된 필드가 저장되고 색인되는 방식을 정의하는 프로세스입니다.

 

예를 들어 매핑을 사용하여 다음을 정의할 수 있습니다.

어떤 문자열 필드를 text 필드로 처리해야 하는지, 숫자나 날짜 또는 지리적 위치를 포함하는지, 날짜 값의 형식, 동적으로 추가된 필드에 대한 매핑을 제어할지에 대한 사용자 지정 규칙 등을 정의할 수 있습니다.

*동적 매핑을 사용한다면, 문서를 색인화 과정에서 새 필드가 자동으로 추가됩니다. 

 

 

한마디로, 스키마 같은 개념으로 각 필드의 데이터 타입과 특성을 정의한다고 이해할 수 있습니다.

 

 

매핑에는 문서와 관련된 필드 또는 속성 목록이 포함되어 있습니다. 그리고 각 필드에는 고유한 데이터 유형이 있습니다.

정의할 수 있는 대표적인 필드 타입은 다음과 같습니다. 

 

- binary : Base64 string 으로 인코딩된 바이너리

- boolean : true 또는 false

- Keywords : keywordconstant_keyword, wildcard 필드

- Numbers : long이나 double 등

- Dates : date 와 date_nanos 필드

- alias : 기존 필드의 별칭 정의

 

이 외에도 nestes, text, dense_vector 등 다양한 필드 타입이 있습니다.

다른 타입들은 예제에서 좀더 자세하게 다뤄볼 기회가 있을 겁니다!

 

그리고 ES 내부적으로 이미 존재하는 메타데이터(Metadata fields) 관련 파라미터를 지정하는 필드도 있습니다.

메타데이터 필드는 문서의 관련 메타데이터가 처리되는 방식을 사용자가 지정하는 데 사용됩니다. 

메타데이터 필드의 예로는 문서의 _index, _id, _source 필드가 있습니다.

 

 

마지막으로 정의할 수 있는 요소로는 매핑 파라미터(Mapping parameters)가 있습니다.

이 중 대표적으로 텍스트 필드를 색인하거나 검색할 때 텍스트 분석에 사용되는 분석기를 지정하는 analyzer, 필드 값을 인덱싱할지 여부를 제어하는 index, object 필드나 nested 필드에 서브 필드를 추가할 때 사용하는 properties 등이 있습니다.

 

 

마무리

인덱스를 정의할 때 사용되는 대표적인 세부 요소 4가지 중 Settings와 Mappings 2가지를 알아보았습니다.

검색엔진 구축 초기에 어떻게 데이터를 저장할 것인가에 대해 고민하며 세부 요소를 정의해야하는데요.

데이터를 저장할 세부 요소에 무엇이 있는지 숲을 먼저 훑어보고, 본인이 저장하려는 데이터에 집중해서 필요한 요소들인 나무를 하나하나 찾아가는 방법이 효율적이라 생각합니다.

처음 엘라스틱 서치를 접하시는 분들께 숲을 잘 소개해드릴 수 있기를 바라며, 다음 글에서 계속 설명드리겠습니다!