영주의 개발노트
Elasticsearch 데이터 타입에 대해 알아보자 본문
현재 일하고 있는 도메인 특성상 Elasticsearch를 사용할 일이 많다. 이번 기회에 Elasticsearch의 주요 데이터 타입들과 타입들의 특징을 정리해보고자 한다. 자세하고 깊게 파는 것은 아니고 대략적인 내용을 정리하고자 한다.
상품 ID 필드 추가 작업 중 해당 type을 text로 지정하였고, 필터 적용을 하려면 type이 long이나 keyword 여야 한다는 리뷰를 받은 적이 있다. 정확히는 exact match 되는 document를 찾기 위해서는 keyword나 long 타입으로 인덱싱 해야 한다는 내용이었는데, 당시에는 개발하느라 수정만 하고 제대로 이해하지 못하고 넘어갔었다. 이와 같은 상황이 발생하지 않도록 ES 데이터 타입에 대해 정리해보고자 한다.
우리는 왜 데이터 타입에 대해 알아야 할까? Elasticsearch에서 데이터 타입은 단순히 저장 형식이 아닌, 데이터가 어떻게 저장되고 검색되며 처리되는지 결정하는 요소이다. 적절한 데이터 타입을 선택하여 우리는 상황에 맞게 데이터를 정의하고, 쿼리 성능을 최적화할 수 있다. 또한, 원하는 검색 결과를 얻을 수 있게 된다. 위 상황처럼 정확한 값 검색이 필요한 상황에서 관련 필드를 text로 정의하면 예상치 못한 검색 결과가 나오게 된다. 그렇다면 Elasticsearch의 데이터 타입에는 어떤 것들이 있는지, 각 타입의 특징에 대해 알아보도록 하겠다.
Elasticsearch의 주요 데이터 타입
1. text
Full-text 검색을 지원한다. text 데이터는 분석 과정을 거쳐 여러 토큰으로 분리되고, 이러한 토큰들을 기반으로 검색이 이루어진다. inverted index가 생성되어 검색 효율을 높인다. 기본적으로 검색 친화적인 구조로 저장되며, 다양한 형태의 텍스트 검색 쿼리를 지원한다. 상품명, 설명, 리뷰 등의 검색이 자주 일어나는 필드에 적합한다.
2. keyword
정확한 값을 검색하거나 필터링에 적합하다. 분석 과정을 거치지 않고 원본 데이터 그대로 저장된다. aggregation, sorting, filtering 작업에 최적화되어 있다. 그렇기에 정렬 및 집계를 필요로 하는 데이터에 keyword 타입을 고려하는 것이 좋다. 대소문자를 구분하며, 이를 무시하는 옵션을 설정할 수 있다. 상품 id, 이메일 주소 등의 정확한 값이 필요한 경우에 사용하면 좋다.
3. long, integer, double 등의 숫자 타입
숫자형 데이터 타입으로 크기와 정밀도에 따라 타입을 구분한다. 가격, 수량, 나이 등 숫자로 표현되는 필드에 사용한다. 범위 검색, 수학 연산, 필터링 작업에도 적합하다.
4. date
날짜 및 시간 데이터를 저장한다. 다양한 날짜 수식을 활용하여 범위 검색 및 정렬이 가능하다. 또한, format 속성을 활용해 날짜 형식을 지정할 수 있다. 타임존을 고려한 검색을 지원하며 생성일, 수정일, 주문 시간 등의 시간 기반 데이터에 사용한다.
5. boolean
true 혹은 false 값을 저장한다. Elasticsearch에서 boolean 타입은 true/false 외에도 1, 0, "true", "false" 등의 값으로 입력 가능하다. 메모리 사용량이 적고 굉장히 빠르게 처리된다. 판매 여부, 숨김 여부 등의 2가지 상태를 표현하는 필드에 아주 적합하다.
6. nested
객체 배열을 저장하기 위해 사용한다. 각 객체를 개별 문서처럼 취급하여 정확한 검색이 가능하다. object와 달리, 배열 내 특정 조건의 데이터를 정확히 검색할 수 있다. 각 객체가 별도의 인덱스를 생성하므로 더 정밀한 쿼리가 가능하지만, 메모리 사용량이 증가하고 성능이 다소 느려질 수 있다. nested 타입을 검색할 때는 반드시 nested 쿼리를 사용해야 한다. 주문 정보 등의 관계형 데이터를 저장할 때 사용한다.. 예를 들어 주문 내역에서 특정 상품이 포함된 주문을 검색할 때 적합하다.
7. object
JSON 객체 형태의 데이터를 저장한다. nested 타입과 달리 object는 하나의 문서로 취급되어 배열 내 특정 조건 검색이 어렵다. 필드가 동적 필드 생성을 지원하므로 구조가 미리 정의되지 않은 데이터를 저장할 때 유용하다. 필드가 동적으로 생성되거나 하위 필드가 많은 경우 적합하다.
그렇다면 왜 text는 exact match에는 적합하지 않을까? 🤔
위에서 text 타입은 Full-text 검색을 지원한다고 하였다. Full-text 검색은 문서 내의 텍스트 전체를 대상으로 검색하는 방식이다. 단순히 특정 문자열을 정확히 매칭시키는 것이 아닌 텍스트를 Analyzer를 통해 분리하고, 키워드, 구문, 문맥 등을 기반으로 관련 있는 문서를 찾아내는 것이다. Analyzer는 공백이나 . 등을 기준으로 텍스트를 토큰화하며, 어근 분석과 같은 추가 처리를 통해 데이터 구조를 변환한다. 또한, 대소문자를 무시하게 되고 오타 교정 및 유사도, 문맥을 파악하여 관련성이 높은 것들을 검색 결과에 포함할 수 있다. Full-text 검색은 원본 데이터가 아닌 분석된 토큰을 기반으로 검색이 이루어지므로 원본 문자열 전체와 일치하는 결과를 내야 하는 exact match에는 적합하지 않다.
정말 간략하게 주요 특징만 정리해 보았다. 이번 정리를 통해 Elasticsearch의 데이터 타입에 대해 어느 정도 인지하고, 인덱싱 시 적합한 타입을 선택할 수 있기를 기대해 본다. 다음에 이와 관련하여 더 자세히 글도 작성해보고 싶다.
'STUDY 📖' 카테고리의 다른 글
당신은 Serialize와 Deserialize의 기본 원리에 대해 아는가? (0) | 2025.02.26 |
---|---|
gRPC와 Protocol Buffers에 대해 알아보자 (2) - Protocol Buffers (1) | 2025.01.14 |
gRPC와 Protocol Buffers에 대해 알아보자 (1) (2) | 2024.12.04 |
🏦 기술 부채 상환 | git merge 와 rebase에 대해 알아보자 (2) (1) | 2024.11.20 |
🏦 기술 부채 상환 | git merge 와 rebase에 대해 알아보자 (0) | 2024.11.06 |