Elastic Search (2) ES CRUD & Search API

백선호·2021년 9월 26일
0
post-thumbnail

이번에는 노드와 통신하는 방법인 REST API를 통해서 CRUD (Create, Read, Update, Delete) 및 인덱스에 대한 검색 작업을 수행해 보겠다.

API로 수행 할 수 있는 몇 가지 작업

  • 클러스터, 노드 및 색인 상태, 상태 및 통계 확인
  • 클러스터, 노드 및 색인 데이터 및 메타 데이터 관리
  • CRUD (Create, Read, Update, Delete) 및 인덱스에 대한 검색 작업 수행
  • 페이징, 정렬, 필터링, 스크립팅, 집계 및 기타 여러 고급 검색 작업 실행

엘라스틱 데이터베이스의 인덱싱 방식


책을 하나 예를 들어 보겠다. 책에 보면 앞에는 목차가 있고 뒤쪽에 보면 색인 단어가 정렬되어 있다. 궁금한 단어가 있다면 색인 단어의 page가 나와있어 단어에 대한 정보를 빠르게 찾아볼 수 있다. 이런한 방식으로 일래스틱 데이터베이스는 인덱싱을 한다. 물론 데이터의 양을 늘어날 수 있지만 속도나 효율 면서에 굉장히 뛰어나다. 상위 사진을 참고하면 조금 이해가 쉬울 것이다.

엘라스틱서치 CRUD


CRUD를 사용할 때는 http 메 서드를 사용한다. 과거에는 put과 post를 엄격하게 구분하는 성격이 있었지만 버전업이 되면서 엄격하게 구분하지는 않고 있다.

관계형DB & 엘라스틱서치

  • 인덱스(Index), 타입(Type), 도큐먼트(Document)의 단위를 갖는다.
  • 도큐먼트는 엘라스틱서치의 데이터가 저장되는 최소 단위이다.
  • 여러 개의 도큐먼트는 하나의 타입이다.
  • 다시 여러 개의 타입은 하나의 인덱스로 구성된다.

Devtool을 사용한 엘라스틱서치 CRUD

일래스틱 서치의 질의 방법에는 여러 가지가 있다. 커맨드 라인의 curl 명령어 사용하는 방법, postman 응용프로그램 사용하는 방법 Kiabana에서 devtool 사용하는 방법이 있다. 필자는 dectool을 사용할 것이다.
localhost:5600을 통해서 elastic에 접속하면 management에 devtool을 찾아볼 수 있다. 처음 들어가게 되면 메시지가 하나 뜨는데 get to work 롤 진행하면 된다.

Create( 인덱스 만들기)

PUT /customers?pretty 
GET /_cat/indices?v

PUT 메 서드를 이용해서 customers라는 인덱스를 만들 것이다. pretty를 붙여주는 이유는 결과를 이쁘게 나오게 하기 위해서다. GET /_cat/indices? v는 인덱스 전체 목록을 확인하는 방법이다.

POST customers/type1/1
{
  "name" : "preferbaik"
  
}

customers 인덱스에 type1에 id=1에 name=preferbaik을 하나 만들었다.

POST customers/type1/_bulk
{"index": {"_id" :"3"}}
{"name" : "preferbaik"}
{"index": {"_id" :"4"}}
{"name" : "prefer"}

_bulk API를 사용하여 위의 작업을 일괄 적으로 수행할 수 있고 최대한 적은 네트워크 왕복으로 가능한 한 빨리 여러 작업을 수행할 수 있다. 이 기능을 배치 프로세스라 하며, 어떤 이유에서건 하나의 행동이 실패하면, 그 행동의 나머지 행동을 계속해서 처리된다. 즉 transaction 적용이 불가능한다.

Read & Delete

GET customers/type1/1
DELETE customers/type1/1

Update

데이터를 수정할 때는 ID를 고쳐 쓰면 모든 내용이 교체된다. ID를 쓰지 않거나 다른 ID를 사용할 경우 새롭게 저장되며 6.x부터는 POST와 PUT을 혼용이 가능해졌다.

POST customers/type1/1
{
  "name" : "prefer"
  
}

Search API

검색을 실행하는 기본적인 두 가지 방법 있다. “URI”를 통해 검색 매개 변수를 보내는 방법, “본문”을 통해 검색 매개 변수를 보내는 방법이 있다.

검색 API 결과

GET /customers/_search?q=*&sort=_id:asc&pretty

customers 인덱스에서 검색을 하고 q=* 매개 변수는 Elasticsearch가 인덱스의 모든 문서와 일치하도록 지시한다. sort=_id:asc는 각 문서의 account_number 필드를 사용하여 결과를 오름차순으로 정렬한다. pretty 매개 변수는 다시 Elasticsearch에게 예쁜 JSON 결과를 반환하도록 지시한다.

  • took : Elasticsearch가 검색을 실행하 는 데 걸린 시간 (밀리 초)
  • timed_out : 검색 시간이 초과되었는지 여부 를 알림
  • _shards : 검색된 파편의 수와 성공 / 실패 한 파편의 수를 알림
  • hits : 검색 결과
  • hits.total : 검색 조건과 일치하는 총 문서 수
  • hits.hits : 검색 결과의 실제 배열 (기본값 은 처음 10 개)
  • hits.sort : 결과 정렬 키 (점수순 정렬시 누락)

본문을 사용한 검색

POST /customers/_search
{
  "query": { "match_all": {} }, 
  "sort": [
  { "_id": "asc" }
  ] 
}

본문 메서드를 사용하여 위와 동일한 검색을 진행할 수 있다. 차이점이라고 한다면, URI에 q=*를 전달하는 대신 _search API에 JSON 스타일 쿼리 요청 본문을 제공했다.

profile
baik9261@gmail.com

0개의 댓글