728x90

엘라스틱서치의 모든 기능은 REST API 형태입니다.

REST 란 웹상의 모든 리소스에 URI를 부여하고 활용하는 아키텍쳐입니다,또한 이것을 도입하면 모든 리소스를 일관된 규칙으로 접근할 수 있어 Application을 모듈이나 기능별로 분리하기 쉬워집니다.

더보기

REST API 는 REpresentational State Transfer 의 약자로 웹(HTTP)의 장점을 이용해 리소스를 주고받는 형태이며, REST API는 REST 기반으로 API를 서비스하는 것을 의미합니다. 메소드와 경로가 합쳐진 형태이고 4가지 메소드를 표현할수 있습니다. 

POST GET PUT DELETE (CRUD)라고도 흔히 알고 있습니다. 다시 말하면 네 가지 메소드 타입을 가지고 리소소의 CRUD(생성/읽기/수정/삭제) 작업을 진행하고 URI 는 리소스를 명시하는 방법입니다. 즉 URI로 리소스를 정의하고 메소드와 함꼐 서버에 요청하고 응답을 받는 구조입니다. 


인덱스와 도큐먼트

엘라스틱서치에서는 인덱스와 도큐먼트가 매우 중요합니다. 그 이유인즉슨, 인덱스는 도큐먼트를 저장하는 논리적 구분자이고, 도큐먼트는 실제 데이터를 저장하는 단위를 뜻합니다.  대부분 ELK를 이용해 시스템을 개발하면 하나의 클러스터를 사용하며, 클러스터 내부는 데이터의 성격에 따라 여러 개의 인덱스를 생성합니다. 

도큐먼트 

데이터가 저장되는 기본 단위로 JSON 형태입니다. 

하나의 도큐먼트는 여러 필드(field)와 값(value)를 갖습니다. 

관계형 데이터베이스와 엘라스틱서치의 데이터 저장 방식을 비교 하여 좀 더 이해하기 쉽게 설명해 드리겠습니다. 

 

일단 기본적으로 MySQL 에서 데이터를 생성하고 저장하는 방식은 이러합니다. 

테이블을 생성하고 쿼리문을 이용해 데이터를 저장합니다. 

하지만 JSON 형식의 도큐먼트 파일은 

{

"name":"mateo",

"age":25,

"gender":"female"

}

즉 위 name,age,gender를 필드라고 하고 : 뒤에 것을 값이라고 합니다.  엘라스틱서치에서는 매핑을 통해서 데이터의 타입을 지정할 수 있습니다.  7버전 이후로는 MySQL과 달라졌습니다 하지만 처음 접하는 분들을 위해 조금 쉽게 설명하고자 인용을 했습니다.

MySQL ELK
테이블 인덱스
레코드 도큐먼트
컬럼 필드
스키마 매핑

 

인덱스

인덱스는 도큐먼트를 저장하는 논리적 단위로, 관계형 데이터베이스의 테이블과 유사한 개념입니다. 

하나의 인덱스에 여러개의 도큐먼트들을 가지는 구조 형태 입니다. 

동일한 인덱스 안에 도큐먼트는 동일한 스키마를 가집니다. 

 

인덱스 이름에는 영어 소문자,/,\,*,?,",<,>,|,#, 공백 쉼표 등을 제외한 특수문자를 사용할수 있고 255바이트를 넘을 순 없습니다.

스키마에 따라 그룹핑을 달리합니다. 일반적으로 스키마에 따라 인덱스를 구분을 합니다.

예를 들어)

회원 정보 도큐먼트와 장바구니 도큐먼트는 성격이 다르기 때문에 데이터 스키마도 다릅니다. 

회원 정보에는 나이 이름 번호 등이 들어가지만 장바구니에는 상품명 상품세일 날짜 등이 들어가기 때문입니다. 

 

인덱스는 용량이나 숫자 제한없이 도큐먼트를 가질수 있지만 검색시 처리 속도가 현저히 느려져서 성능이 나빠집니다. 

그래서 하나의 약속 처럼 엘라스틱에서는 용량을 제한을 둡니다. 기본적으로 특정 도큐먼트 개수에 도달하거나 특정 용량을 넘어서면 인덱스를 분리합니다.( 혹은 날짜 년도, 특정 주기를 통해 분리 삭제 합니다. ) 

 

 

도큐먼트 CRUD

ELK 에 도큐먼트를 저장하고 읽어오고 수정하고 삭제 하기에 대해 알아보도록하자. 

되게 간단합니다. PUT index1 GET index1  DELETE index1 의 입력를 해주면 생성하고 가져오고 삭제시켜줍니다. 

 

도큐먼트의 생성  : 도큐먼트는 하나의 인덱스를 무조건 포함 시켜야합니다. 

도큐먼트를 인덱스에 포함 시키는것을 인덱싱이라고 합니다. 

 

도큐먼트 인덱싱할때 타입을 지정하지 않아도 자동으로 엘라스틱서치에서 자동으로 타입을 지정해줍니다.

또한 인덱스에 새로운 도큐먼트를 인덱싱할 수 있다.

PUT index1/_doc/2

{

"name":"jane",

"country":"korea"

}

여기서는 나라 라는 이름의 필드를 추가하였습니다.

기존에 있던 다른 필드는 사용하지 않았습니다(age,gender) 그래도 큰 문제는 없습니다. 

엘라스틱서치의 장점으로 타입을 잘못 적더라도 스키마에서 유연하게 대응하여 타입을 변환해 줍니다. 

float으로 저장한것을 text로 저장해도 float로 다시 타입변환을 하여 저장해줍니다. 

예) 숫자 필드에 문자열이 입력되면 숫자로 변환을 시도합니다 .

정수 필드에 소수가 입력되면 소수점 아래 자리를 무시합니다.

 

도큐먼트 읽기/수정/삭제

도큐먼트를 읽는 방법은 크게 도큐먼트 아이디를 이용해 조회 하는 방법과 쿼리DSL이라는 엘라스틱서치가 제공하는 쿼리문을 이용하여 검색할수 있습니다.

아이디를 이용하는 방법 : GET index2/_doc/1 

쿼리문을 이용한 방법 : GET index2/_search

 

수정 방법:PUT index2/_doc/1 안에 필드  값(value)를 변경해주면 값이 변경 됩니다. 

그저 도큐먼트를 인덱싱 하는 과정에서 같은 도큐먼트 아이디가 있으면 덮어쓰기 형식입니다. 

update API를 사용하여 도큐먼트를 업데이트 할 수 있습니다.

PUT index2/_update/1

{

  "doc":{

     "name":"eom"

    }

}

 

_update 라는 에드포인트를 추가해 특정 필드의 값만 업데이트 할 수 있습니다.

ELK에서 수정 작업은 비용이 많이 드는 작업이라서 추천하지 않습니다. 

 

도큐먼트 삭제 :  DELETE index2/_doc/2 하시면 index2 인덱스에서 아이디 2인 도큐먼트가 삭제됩니다. 서치를 통해 인덱스의 전체 도큐먼트를 파악한 후 삭제 하셔도 괜찮습니다. 별개로 수정과 마찬가지로 삭제 또한 비용이 많이 들어가는 작업입니다. 사용 시에 주의해야 한다. 

728x90
복사했습니다!