Elasticsearch - 필드 데이터 타입 알아보기 - (4) `array`, `numeric`
Reference
- https://github.com/nobaksan/fastcampus-elasticsearch-part1
- https://github.com/munkyu/fastcampus-es
- https://github.com/kkdeok/fastcampus-elasticsearch
오늘의 API
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
PUT /products/_doc/1
{
"name": "스마트폰",
"tags": ["전자기기", "휴대폰", "스마트"]
}
PUT /real_estate
{
"mappings": {
"properties": {
"price": {
"type": "long"
},
"number_of_rooms": {
"type": "short"
},
"building_age": {
"type": "integer"
},
"visitor_count": {
"type": "double"
}
}
}
}
필드 데이터 타입 종류
Elasticsearch에 사용되는 필드 데이터 타입은 크게 3가지로 나뉠 수 있습니다.
- 지형 데이터 타입
geo_point
geo_shape
- 계층 구조 데이터 타입
Object
Nested
- 일반 데이터 타입
keyword
,text
date
long
,double
,integer
, ..boolean
,ip
각각의 데이터 타입은 모두 저마다의 특징을 갖고 있습니다. 데이터 저장 시 적절한 타입으로 mapping해주는 것이 필요합니다. 아래에서 필드 데이터 타입 중 문자열 데이터 타입 유형에 대해 먼저 살펴보겠습니다.
array
타입
Elasticsearch의 배열 필드에 대한 이해
Elasticsearch에서 데이터를 구성하고 쿼리하는 방식을 이해하는 것은 데이터를 효율적으로 관리하고 검색하는 데 중요합니다. 특히, Elasticsearch에서는 별도의 배열 타입이 존재하지 않지만, 어떤 필드든 자유롭게 배열 형태로 데이터를 저장할 수 있는 유연성을 제공합니다.
배열 필드 타입의 기본 개념
Elasticsearch는 별도의 배열 타입을 따로 정의하지 않습니다. 대신, 어떤 필드든 자연스럽게 여러 값을 배열로 저장할 수 있습니다. 이는 Elasticsearch가 내부적으로 배열을 자동으로 인식하고 처리할 수 있는 구조를 가지고 있기 때문입니다.
예시
- 문자열 배열:
["허드슨", "밸리"]
- 숫자 배열:
[-100, 100]
- 객체 배열:
[{"id": 1}, {"id": 2}]
이처럼 다양한 타입의 데이터를 배열 형태로 저장할 수 있으며, 이 배열은 검색 쿼리에서 효과적으로 활용될 수 있습니다.
배열 필드의 데이터 타입 일관성
Elasticsearch에서 배열로 데이터를 저장할 때 주의해야 할 중요한 점은 배열 내의 모든 요소가 동일한 데이터 타입을 가져야 한다는 것입니다. 예를 들어, 숫자와 문자열을 섞어서 하나의 배열로 저장하는 것은 허용되지 않습니다. 이는 데이터의 일관성을 유지하고, 검색 엔진이 효율적으로 데이터를 처리할 수 있도록 하기 위함입니다.
자바 배열과의 비교
이러한 특성은 자바와 같은 프로그래밍 언어에서 배열을 사용하는 방식과 유사합니다. 자바에서 배열은 특정 데이터 타입의 요소만을 포함할 수 있으며, 이는 Elasticsearch의 배열 처리 방식과 맥을 같이 합니다.
배열 필드의 활용 예
Elasticsearch에서 배열 필드는 다양한 상황에서 유용하게 사용됩니다. 예를 들어, 하나의 문서에서 여러 개의 태그, 카테고리, 또는 제품 속성을 저장할 때 배열 필드를 활용할 수 있습니다. 이를 통해 복잡한 데이터 구조를 간단하게 표현하고, 효과적으로 쿼리할 수 있습니다.
1
2
3
4
5
PUT /products/_doc/1
{
"name": "스마트폰",
"tags": ["전자기기", "휴대폰", "스마트"]
}
결론
Elasticsearch에서 배열 필드를 사용하는 것은 데이터 구조를 유연하게 설계하고, 다양한 타입의 데이터를 효과적으로 관리할 수 있는 방법을 제공합니다. 배열을 통해 여러 값을 간편하게 저장하고, 이를 기반으로 강력한 검색 기능을 구현할 수 있습니다. 배열 필드를 올바르게 사용함으로써, 데이터 관리의 효율성을 크게 높일 수 있습니다.
numeric
타입
아래 표는 Elasticsearch에서 제공하는 다양한 숫자형 필드 타입의 특징을 요약하여 보여줍니다. 각 필드 타입은 사용되는 비트 수와 주요 사용 사례에 따라 구분됩니다.
필드 타입 | 비트 수 | 설명 | 주요 사용 사례 |
---|---|---|---|
Long | 64비트 | 매우 큰 정수 값 저장 | 매우 큰 범위의 정수가 필요한 경우 |
Integer | 32비트 | 일반적인 크기의 정수 저장 | 대부분의 일반적인 사용 사례에 적합 |
Short | 16비트 | 작은 범위의 정수 저장 | 저장 공간 절약이 필요하고 값의 범위가 제한적인 경우 |
Byte | 8비트 | 매우 작은 정수 값 저장 | 메모리 사용을 최소화하고자 할 때 |
Double | 64비트 | 큰 실수 값 높은 정밀도로 저장 | 과학적 계산이나 정밀한 수치 분석이 필요한 경우 |
Float | 32비트 | 실수 저장, Double보다 메모리 사용량 적지만 정밀도 낮음 | 정밀도보다 저장 공간 절약이 더 중요한 경우 |
Half_float | 16비트 | 실수 저장, 매우 낮은 메모리 사용 | 낮은 정밀도를 감수할 수 있는 경우 |
각 숫자형 필드 타입은 특정 데이터의 특성과 어플리케이션의 요구에 맞게 선택되어야 합니다.
예를 들어, 대량의 데이터를 처리하면서도 저장 공간을 효율적으로 사용하고 싶다면 float
또는 half_float
를 고려할 수 있습니다. 반면, 정밀한 수치 처리가 필요하다면 double
을 선택하는 것이 좋습니다. 데이터의 크기와 처리 요구 사항에 따라 적절한 타입을 선택하여, Elasticsearch를 최대한 효율적으로 활용할 필요가 있습니다.
숫자형 필드 타입 사용 예시
Elasticsearch에서 각기 다른 숫자형 필드 타입을 어떻게 활용할 수 있는지 구체적인 예시를 통해 살펴보겠습니다. 이 예시는 부동산 데이터베이스 시나리오에서 각 필드 타입이 어떻게 적용될 수 있는지를 보여줍니다.
부동산 데이터베이스
부동산 매물에 대한 정보를 저장하는 Elasticsearch 인덱스를 구성하려고 합니다. 각 매물은 매물의 가격, 방의 개수, 건물 연차, 방문객 수 등의 정보를 포함합니다.
- 매물 가격 (Price):
- 필드 타입:
long
- 설명: 매물 가격은 매우 높은 범위의 값이 될 수 있으므로
long
타입을 사용하여 큰 정수 값을 저장합니다.
- 필드 타입:
- 방의 개수 (Number of rooms):
- 필드 타입:
short
- 설명: 방의 개수는 일반적으로 낮은 숫자이므로
short
타입을 사용하여 메모리 사용을 최소화합니다.
- 필드 타입:
- 건물 연차 (Building age):
- 필드 타입:
integer
- 설명: 건물의 연차는 중간 범위의 정수로 표현될 수 있으므로
integer
타입을 사용합니다.
- 필드 타입:
- 방문객 수 (Visitor count):
- 필드 타입:
double
- 설명: 방문객 수는 소수점을 포함할 수 있는 데이터일 때가 있습니다(예: 평균 방문객 수). 높은 정밀도가 필요한 경우
double
타입을 사용합니다.
- 필드 타입:
Elasticsearch 매핑 설정 예
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
PUT /real_estate
{
"mappings": {
"properties": {
"price": {
"type": "long"
},
"number_of_rooms": {
"type": "short"
},
"building_age": {
"type": "integer"
},
"visitor_count": {
"type": "double"
}
}
}
}
이 예시를 통해 각 필드의 데이터 유형과 특성에 따라 적절한 숫자형 필드 타입을 선택하고 Elasticsearch에 적용하는 방법을 보여줍니다. 각 타입은 데이터의 성격과 저장 및 검색 요구에 따라 선택되어, 저장 공간을 효율적으로 사용하고 검색 성능을 최적화합니다.