본문 바로가기
📂 데이터베이스/◾ ELASTICSEARCH

[ELK Stack] Elasticsearch의 이해, REST API와 CRUD

by 이 정규 2023. 6. 19.
728x90
반응형

 

Elasticsearch 공부해서 회사에서 살아남기 (1)

ELK Stack

다니는 직장에서는 ELK(Elasticsearch + Logstash + Kibana) Stack을 사용한다. 물론 RDBMS도 사용하지만 각각의 용도가 다르다. ELK Stack은 쿼리 - 수집 - 시각화를 맡고 RDBMS는 데이터 저장소의 역할을 한다. 사업마다 효율성을 따져 데이터 저장소를 따로 두지 않기도 하는데 그건 사업 바이 사업인듯 하다. 그래서 결론적으로 나는 ELK Stack 플로우를 이해해야 했고, 그 중 가장 내가 많이 맡아 하게 될 Elasticsearch에 대해서 오늘 기본 문법 관련한 글을 작성해보고자 한다.

Elasticsearch는 Apache Lucene(아파치 루씬) 기반 java 오픈소스 분산 검색 엔진이다. 위에는 ELK Stack 이라는 이름으로 묶어서만 사용하듯 말했지만 하나 하나가 독자적으로 서비스를 제공한다. 저걸 묶어 사용하는 이유는 한 회사에서 만들었고 각 서비스간의 데이터 이동이 쉽기 때문이다. Elasticsearch 는 이들 중 데이터를 거의 실시간에 가까운 속도로 저장, 검색, 분석할 수 있다.

RDBMS와의 차이점

RDBMS를 공부해 본 사람이라면 아래 표를 보면 쉽게 이해할 수 있을 것 같다. 내가 공부한 바를 기준으로 가볍게 이야기 해보자면, 우선 기본적으로 용어가 다르다.(내용물은 같다.) 그리고 스키마에 타입을 미리 정해줄 필요가 없다. 마지막으로 분석기를 이용한 역색인이 가능하다. 이 정도가 눈에 띄는 차이점이라고 생각된다. 

Elasticsearch RDBMS
mapping schema
index database
type table
document row
field column

데이터 처리

REST API

ES(Elasticsearch)는 http 프로토콜로 접근이 가능한 REST API를 지원한다. http 메서드 PUT, POST, GET, DELETE를 이용해 데이터를 처리한다. 고로 RESTFul 하다고 할 수 있겠다.

MacOS, Linux와 같은 Unix 기반 운영체제에선 curl 명령어로 사용이 가능하다. ES를 실행한 뒤에 curl 명령어를 이용해서 ES 클러스터의 최상위 경로를 호출하면 json 형식의 상태 정보가 리턴된다. 보통 서버에 ES를 깔고 제대로 깔렸나 이런 식으로 확인을 하고는 한다. 

$ curl -XGET "http://localhost:9200"
{
  "name" : "zzgr-MacBook-Pro.local",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "hpmT8TPiR1Kk69YNao9V3w",
  "version" : {
    "number" : "8.5.3",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "de777fa",
    "build_date" : "2022-12-24T18:30:11.767338Z",
    "build_snapshot" : false,
    "lucene_version" : "9.3.0",
    "minimum_wire_compatibility_version" : "7.17.0",
    "minimum_index_compatibility_version" : "7.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

 

CRUD
입력 (PUT)

RDBMS의 데이터베이스와 같은 역할을 하는 index를 생성한다.

PUT index1
# POST index1 를 이용해서도 인덱스를 생성할 수 있다.

조회 (GET)

GET 메서드로 가져올 인덱스나 도큐먼트를 입력하면 내용을 가져온다.

GET index1

삭제 (DELETE)

인덱스를 삭제하면 당연하게도 도큐먼트들도 삭제된다.

DELETE index1

예제

예제를 이용해서 RESTFul한 인간이 되어보도록 하자.
이름,나이, 주소의 정보를 가지고 있는 index2 인덱스에 도큐먼트 아이디가 1인 데이터를 입력한다.

PUT index2/_doc/1
{
  "name" : "Evan",
  "age" : 28,
  "addr" : "Seoul"
}
GET index2

 

 

GET 메서드로 생성한 index2 를 조회하면 mappings에 agelong 타입, addrtext 타입으로 필드가 지정되었다. RDBMS의 차이점을 위에서 간단하게 말할 때 이야기한대로다. 데이터 타입을 지정하지 않아도 도큐먼트의 필드와 값을 보고 자동 지정해준다. 이를 dynamic mapping 이라고 한다.

다음 예제를 위해 도큐먼트 아이디 2와 3을 만들어준다. 다양한 매핑 값을 보기 위해 국가와 성별을 추가해봤다.
 
PUT index2/_doc/2
{
  "name" : "Jane",
  "country" : "France"
}

PUT index2/_doc/3
{
  "name" : "Alan",
  "age" : "33",
  "gender" : "male"
}

 

도큐먼트 아이디 1에 PUT 메서드로 새로운 정보를 입력하면 덮어쓰기 방법으로 1번 도큐먼트 값이 변경된다. 그리고 출력 내용 중 result 항목에서 update라고 표기되어 있음을 확인할 수 있다.

PUT index2/_doc/1
{
  "name" : "Park",
  "age" : 45,
  "gender" : "male"
}

 

API를 이용하여 업데이트 해도 결과는 위와 같다. 차이점은 1번 방법과 달리 API를 이용하면 특정 필드의 값만 업데이트 할 수 있다.

POST index2/_update/1
{
  "doc" :{
    "name" : "Lee"
  }
}

 

ES의 기본적인 내용을 총 5편으로 나누어 포스팅 할 예정이다. 기존 SQL 쿼리를 좀 짜본, 놀 줄 아는 사람이라면 꽤나 쉽게 느껴질 것 같다. 나는 해당 사항이 없기 때문에 이번에도 아주 머리를 맨틀까지 쳐박으며 공부해보려고 한다. 오늘도 남의 공부 이야기 봐주셔서 고맙습니다. 그럼 이만!

 

 

 

 

728x90
반응형

댓글