elastic search 기초
데이터 구조
- 클러스터: 하나의 프로젝트에 하나의 클러스터를 생성해 사용
- 인덱스: 도큐먼트를 저장하는 논리적 구분자
- 도큐먼트: 실제 데이터를 저장하는 단위, JSON 형태, 복수의 필드를 갖는다.
MySQL과 비교
MySQL | 엘라스틱서치 |
---|---|
테이블 | 인덱스 |
레코드 | 도큐먼트 |
컬럼 | 필드 |
스키마 | 매핑 |
매핑 mapping
엘라스틱서치 매핑으로 인덱스 스키마와 필드들의 데이터 타입을 지정할 수 있다.
타입 type
엘라스틱 7.x 이전 버전에 존재했던 데이터 구조이나, 현재는 더 이상 사용하지 않는다. 이전에 인덱스(테이블)처럼 동작했다.
- 하나의 인덱스 내부에서 여러 타입을 지정할 수 있었다.
- 즉, 인덱스 내부에 타입에 따라 각각 다른 스키마의 도큐먼트들을 저장할 수 있었다.
도큐먼트
- 데이터가 저장되는 기본 단위로 JSON 형태이며 하나의 도큐먼트는 여러 필드와 값을 갖는다.
- 도큐먼트는 반드시 하나의 인덱스에 포함돼야 한다.
인덱스
- 인덱스는 영어 소문자를 비롯해 일부 문자를 제외한 특수문자를 사용할 수 있으며 255 바이트를 넘을 수 없다.
스키마에 따른 그룹핑
- 일반적으로 스키마에 따라 인덱스를 구분한다.
관리 목적의 그룹핑
- 인덱스가 너무 커지면 성능이 나빠지는 문제가 있으므로, 엘라스틱서치를 운용할 때 인덱스 용량 제한을 둔다.
- 기본적으로 특정 도큐먼트 개수에 도달하거나 용량을 넘어서면 인덱스를 분리한다.
- 일/주/월/년 단위 같은 날짜/시간 단위로 인덱스를 분리할 수 있다.
- 효율적으로 대량의 데이터를 관리하기 위해 그룹핑을 수행한다.
es 기본 API
인덱스 생성/확인/삭제
PUT index1
GET index1
DELETE index1
- 인덱스를 삭제하면, (당연히) 내부 도큐먼트들도 모두 삭제된다. 주의 필요!
도큐먼트 생성
인덱싱 indexing
- 도큐먼트는 반드시 하나의 인덱스에 포함되어야 하며, 이러한 작업을 인덱싱이라고 한다.
PUT hidle/_doc/1
{
"name": "han",
"age": 20,
"region": "충청도",
"gender": "male"
}
GET hidle
- 기존에 존재하지 않는 인덱스라면, 도큐먼트와 함께 생성한다.
- 타입을 따로 지정하지 않아도 도큐먼트의 필드와 값을 보고 자동으로 매핑을 지정한다. 이런 기능을 다이내믹 매핑이라고 한다.
PUT hidle/_doc/2
{
"name": "kang",
"region": "경상도"
}
PUT hidle/_doc/3
{
"name": "park",
"age": "20",
"gender": "female"
}
인덱스 조회 결과
{ "hidle": { "aliases": {}, "mappings": { "properties": { "age": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "city": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "gender": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "name": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "region": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } } } }, "settings": { "index": { "routing": { "allocation": { "include": { "_tier_preference": "data_content" } } }, "number_of_shards": "1", "provided_name": "hidle", "creation_date": "1749987416355", "number_of_replicas": "1", "uuid": "WH17k0DNQIKYOGcuRe-39w", "version": { "created": "8518000" } } } } }
새로운 필드 데이터가 들어오면 자동으로 필드가 추가된다.
데이터 타입을 잘못 지정해도 엘라스틱서치가 스키마에 유연하게 대응하여 타입을 변환해 저장한다.
대표적인 형변환 규칙
- 숫자 필드에 문자열이 입력되면 숫자로 변환을 시도한다.
- 정수 필드에 소수가 입력되면 소수점 아래 자리를 무시한다.
도큐먼트 읽기
크게 2가지 방법이 있다.
- 도큐먼트 아이디를 이용하여 조회하는 방법
- 빅데이터 환경에서 도큐먼트 하나씩 조회하는 경우는 드물기에 잘 사용되지 않는다.
- 엘라스틱 서치가 제공하는 쿼리 DSL(Domain Specific Language)을 이용하여 검색
GET hidle/_doc/3
// 형변환 규칙과 관련 - 아래 응답을 보면 age에 "20"으로 값이 들어가 있다.
{
"_index": "hidle",
"_id": "3",
"_version": 1,
"_seq_no": 2,
"_primary_term": 1,
"found": true,
"_source": {
"name": "park",
"age": "20",
"gender": "female"
}
}
// DSL 쿼리, 인덱스 내 모든 도큐먼트 조회
GET hidle/_search
도큐먼트 수정
생성과 동일한 API 활용
-도큐먼트를 인덱싱하는 과정에서 같은 도큐먼트 아이디가 있으면 덮어쓰기로 처리한다.API 응답 결과에 도큐먼트가 업데이트 되었다고 나온다.
PUT hidle/_doc/1 { "name": "choi", "age": 20, "region": "충청도" }
update API 이용
특정 필드의 값만 업데이트 할 수 있다.
POST hidle/_update/1 { "doc": { "name": "choi" } }
엘라스틱서치 도큐먼트 수정 작업은 비용이 많이 들어서 권장되지 않는다.
- 개별 도큐먼트 수정이 많은 작업이라면 엘라스틱서치가 아닌 다른 DB를 이용하는 것이 좋다.
도큐먼트 삭제
DELETE hidle/_doc/2
- 도큐먼트 수정과 마찬가지로 개별 도큐먼트 삭제 또한 비용이 많이 들어가는 작업인 만큼 사용에 주의가 필요하다.
벌크 데이터 API
PUT /_bulk
{"index": {"_index": "hidle", "_id": "1"}}
{"name":"han", "gender":"male", "region":"충청도"}
{"create": {"_index": "hidle", "_id": "5"}}
{"name":"hwang", "gender":"female", "region":"경상도"}
{"create": {"_index": "hidle", "_id": "4"}}
{"name":"choi", "gender":"male", "region":"충청도"}
{"update": {"_index": "hidle", "_id": 4}}
{"doc":{"age": 20}}
{"delete": {"_index": "hidle", "_id": "5"}}
- 벌크로 한 번에 요청을 하는 것이 효율적이다.
- API 콜 횟수를 줄여 성능을 높일 수 있다.
- bulk API 는 읽기는 지원하지 않고 생성/수정/삭제만 지원한다.
- 삭제(delete)만 한 줄로 작성하고 나머지 작업들(index, create, update)은 두 줄로 작성한다.
- NDJSON(New-line Delimited JSON) 형태의 문법을 사용한다.
- 각 줄 사이에 쉼표 등 별도의 구분자 없이 줄바꿈만 수행하며, 라인 사이의 공백을 허용하지 않는다.
- 벌크 데이터를 파일 형태로 만들어 적용하는 방법도 있다.
- 현업에서 실용성 있게 활용 가능
- 참고) PUT indexname/_bulk 형태로도 작성할 수 있다.
참조 자료
'Infra > DB' 카테고리의 다른 글
[ElasticSearch]기초 알아가기 03. (0) | 2025.06.23 |
---|---|
[Elasticsearch]기초 알아가기 02. (0) | 2025.06.18 |
몽고DB 구성(Replica Set/Sharded Cluster) 간단히 알아보기 (0) | 2025.05.31 |
[MongoDB]몽고디비 개요 (0) | 2025.05.28 |
[Redis]Sentinel 구성 실습(Docker 활용) (1) | 2025.05.26 |