![[ElasticSearch] 데이터 타입(data type)과 매핑(mapping)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAYhg1%2FbtsOkUkqLeJ%2FR9KpjGlbng2kdEadfk1mfK%2Fimg.png)
[ElasticSearch] 데이터 타입(data type)과 매핑(mapping)Back-End/ElasticSearch2025. 5. 31. 16:43
Table of Contents
이 글은 인프런의 지식 공유자 박재성님의 강의를 듣고 개인적으로 정리하는 글임을 알립니다.
데이터 타입
Elasticsearch에서 데이터 타입의 종류는 아주 많다.
그 중 이 글은 자주 사용하는 데이터 타입에 대해서만 정리한다.
숫자
- integer : 10억 이하의 정수만 저장하면 되는 경우
- long : 10억이 넘어가는 정수를 저장해야 될 수도 있는 경우
- double : 실수(소숫점을 가진 숫자 포함)를 저장해야 될 수도 있는 경우
문자
- text
- 문자열을 토큰으로 쪼개서 저장하고 싶은 경우
- 유연한 검색이 필요할 때 (완전히 일치하지 않아도 비슷한 데이터를 조회해오는 방식) - keyword
- 정확한 검색이 필요할 때 (정확하게 일치할 때만 데이터를 조회해오는 방식)
- ex) 휴대폰 번호(010-1234-5678), 이메일(jscode@gmail.com), 주문번호(156293920)
- 계산에서 쓰는 값이 아니라면 숫자가 아닌 문자로 저장해야 한다. 예를 들어, 휴대폰 번호나 주민등록번호에 숫자를 더하거나 빼지 않는다. 즉, 휴대폰 번호나 주민등록번호는 숫자가 아닌 문자로 저장해야 한다.
기타
- date : 날짜 데이터를 저장해야 하는 경우
- boolean : true, false를 저장해야 하는 경우
매핑
매핑 개념
매핑(mapping)이란 도큐먼트(document)의 각 필드가 어떤 데이터 타입을 가지고 있는 지 정의하는 설정을 의미한다.
MySQL에서 테이블을 만들 때 어떤 유형의 데이터를 넣을 지 스키마(schema)를 정의하는 것처럼, Elasticsearch에서 인덱스를 만들 때 어떤 유형의 데이터를 넣을 지 매핑(mapping)을 정의할 수 있다.
도큐먼트
ElasticSearch에서 도큐먼트란 RDBMS에서 행(row) 또는 레코드라고 생각하면 된다.
매핑 특징
ElasticSearch의 매핑은 아래와 같은 두 가지 특징이 있다.
- null 허용
- 배열 허용
null 허용
Elasticsearch는 매핑을 정의하더라도 해당 필드가 반드시 존재하거나 null이면 안 된다는 제약을 두지 않는다.
"mappings": { "properties": { "title": { "type": "text" } "content": { "type": "text" } } } |
이런 상태에서 아래와 같이 데이터를 넣어도 아무런 문제가 되지 않는다.
{ "title": null, "content": "산다는 것 그것은 치열한 전투이다." } |
{ "content": "산다는 것 그것은 치열한 전투이다." } |
배열 허용
Elasticsearch는 별도의 설정 없이 배열(array) 형태의 데이터를 삽입할 수 있다.
그리고 배열(array)에 특화된 매핑 타입(mapping type)이 따로 없다.
"mappings": { "properties": { "hashtags": { "type": "text" } } } |
이런 상태에서 아래와 같이 데이터를 넣어도 아무런 문제가 되지 않는다.
{ "hashtags": "여행" } |
{ "hashtags": ["여행", "요리"] } |
"여행"이라는 키워드로 검색하면 위 2가지 데이터 전부 다 조회된다.
매핑 정의 예시
{ "review_id": 923874239847, "user_id": 1024, "user_name": "김영희", "categories": ["가전", "청소기"], "rating": 4.5, "is_verified_purchase": true, "review_date": "2024-09-21T14:32:00Z", "review_text": "배송이 빨랐고 제품도 만족스러워요." } |
이와 같은 데이터를 삽입해야한다고 하면 아래와 같이 매핑을 정의할 수 있다.
PUT /product_reviews { "mappings": { "properties": { "review_id": { "type": "long" // 현업에서 확장성을 고려해 integer가 아닌 long으로 셋팅하는 편 }, "user_id": { "type": "long" // 현업에서 확장성을 고려해 integer가 아닌 long으로 셋팅하는 편 }, "user_name": { "type": "text" // 일부분으로도 검색할 수 있게 설정 (만약 부분 검색이 필요 없다면 keyword로 설정) }, "categories": { "type": "keyword" // 정확한 비교로만 사용하기 때문에 keyword로 설정 }, "rating": { "type": "double" // 소수점을 가진 숫자이므로 double로 설정 }, "is_verified_purchase": { "type": "boolean" }, "review_date": { "type": "date" // 날짜 데이터 }, "review_text": { "type": "text" // 유연하게 검색할 수 있도록 text 설정 } } } } |
데이터를 삽입할 때는 아래와 같이 삽입하면 된다.
POST /product_reviews/_doc { "review_id": 923874239847, "user_id": 1024, "user_name": "김영희", "categories": ["가전", "청소기"], "rating": 4.5, "is_verified_purchase": true, "review_date": "2024-09-21T14:32:00Z", "review_text": "배송이 빨랐고 제품도 만족스러워요." } |
'Back-End > ElasticSearch' 카테고리의 다른 글
[ElasticSearch] match, term, bool (3) | 2025.06.01 |
---|---|
[ElasticSearch] 한글 검색 최적화(Nori Analyzer) (0) | 2025.06.01 |
[ElasticSearch] 애널라이저(Analyzer) (0) | 2025.05.31 |
[ElasticSearch] 역인덱스(Inverted Index) (0) | 2025.05.31 |
[ElasticSearch] 인덱스, 도큐먼트, 매핑, 필드 (0) | 2025.05.30 |