3 분 소요

✔ 엘라스틱서치 CRUD

클러스터 탐색

Elasticsearch는 클러스터와 상호 작용하는데 사용할 수 있는 REST API 제공

REST API

  • 노드와 통신하는 방법
  • API로 수행 할 수 있는 몇 가지 작업
    • 클러스터, 노드 및 색인 상태, 통계 확인
    • 클러스터, 노드, 색인 데이터, 메타 데이터 관리
    • CRUD(Create, Read, Update, Delete) 및 인덱스에 대한 검색 작업 수행
    • 페이징, 정렬, 필터링, 스크립팅, 집계 및 기타 여러 고급 검색 작업 수행
  • 웹의 창시자(HTTP) 중의 한 사람 RoyFelling 2000년 논문에 의해 소개
    • 웹의 장점을 최대한 활용할 수 있는 네트워크 기반의 아키텍쳐
  • 구성요소 3가지

    HTTP POST, http://myweb/users/
    {
        "users" : {
            "name": "gasbugs"
        }
    }
    
    • 리소스 (URI)
    • 메서드 (POST)
    • 메시지 (위 코드 전체를 표현)

클러스터 상태(Health)

# _언더바 : API를 의미한다, REST API랑은 무관
# _update
# _search
# _cat: 노드의 대한 상태를 출력
# ?v: 상세 정보를 보여준다
GET /_cat/nodes?v
  • 클러스터가 어떻게 진행되고 있는지 기본적인 확인
  • curl을 사용하여 이를 수행
  • HTTP/REST 호출을 수행 할 수 있는 모든 도구를 사용 가능
  • 클러스터 상태를 확인하기 위해 _cat API를 사용
  • 녹색
    • 모든 것이 좋음(클러스터가 완전히 정상 작동 함)
  • 노란색
    • 모든 데이터를 사용할 수 있지만 일부 복제본은 아직 할당되지 않음
    • 클러스터는 작동 된 상황
  • 빨간색
    • 어떤 이유로든 일부 데이터를 사용할 수 없음
    • 클러스터가 부분적으로 작동함
    • 빨간색이 나오면 문제가 있다는 의미

데이터베이스가 가진 데이터 확인하기

GET /_cat/indices?v
  • 갖고 있는 모든 인덱스 항목 조회
  • index는 일반 RDB에서 데이터베이스의 역할
  • indecies
    • index의 복수형
    • 즉, 위 명령어는 데이터베이스를 전부 확인한다는 의미

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

Index(DataBase)

문서 문서 내용
Doc1 blue sky green land red sun
Doc2 blue ocean green land
Doc3 red flower blue sky
검색어 검색어가 가리키는 문서
blue Doc1, Doc2, Doc3
sky Doc1, Doc3
green Doc1, Doc2
land Doc1, Doc2
red Doc1, Doc3
ocean Doc2
flower Doc3
sun Doc1
  • 엘라스틱 서치는 데이터를 역색인하여 저장한다.
  • 검색어해당 단어가 어느 문서(Document)에 포함이 되어있는지 확인한다.
  • blue라는 단어를 검색 시 Doc1, Doc2, Doc3 문서를 가르킨다.
  • 데이터의 양이 많아진다는 단점이 있지만, 데이터 검색 속도가 증가한다.

HTTP 메서드와 CRUD, SQL을 비교

HTTP 메서드 CRUD SQL
GET Read Select
PUT Update Update
POST Create Insert
DELETE Delete Delete
  • 해당 열이 Elasticsearch에서 사용이 되는 HTTP 메서드.
  • 6.x 부터 PUT이랑 POST를 엄격히 구분하지 않고 사용을 한다.
  • Mapping?
    • 데이터베이스의 구성요소를 구성한다, 테이블 생성.
    • Elasticsearch는 Mapping이 필수 사항이 아니다.
    • 하지만 필요한 상황이 존재.

✔ 엘라스틱서치 데이터 처리

엘라스틱서치의 데이터 구조

  • 인덱스(Index), 타입(Type), 도큐먼트(Document)의 단위를 가짐
  • 도큐먼트는 엘라스틱서치의 데이터가 저장되는 최소 단위
  • 여러 개의 도큐먼트는 하나의 타입(테이블)
  • 다시 여러 개의 타입은 하나의 인덱스(스키마)로 구성
엘라스틱서치 관계형 DB
Index Database
Type Table
Field Column
Document Row
Mapping Scema

엘라스틱 서치 질의 방법

  • CLI의 curl 명령어 사용
  • postman 응용프로그램 사용
  • Kibana에서 제공해주는 devtool 사용

데이터 입력/조회/삭제/업데이트 요약

6.x 버전부터는 PUT과 POST를 혼용하여 사용한다

데이터 처리 메서드 구문
입력 PUT http://localhost:9200/index1/type1/1 -d ‘{”num”: 1, “name”: “llsun Choi”}’
조회 GET http://localhost:9200/index1/type1/1
삭제 DELETE http://localhost:9200/index1/type1/1
업데이트 POST http://localhost:9200/index1/type1/1 _update -d ‘’{doc: {”age”: 99} }’

URI 분석

http://localhost:9200/index1/type1/1 -d ‘{”num”: 1, “name”: “llsun Choi”}’

  • index1
    • Database 명명
  • type1
    • 테이블 정의
  • 1
    • Document(Row)
  • -d ‘{”num”: 1, “name”: “llsun Choi”}’
    • 메시지 부분
    • 메시지는 반드시 key - value 한 쌍으로 들어가야 한다

✔ 인덱스 만들기

Customer Index 생성

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

<curl 명령어>
curl -X PUT "localhost:9200/customer?pretty"
curl -X PUT "localhost:9200/_cat?indices?v"
  • 첫 번째 명령은 PUT 동사를 사용하여 “customer”라는 색인을 생성
  • JSON 응답 (있을 경우)을 포맷팅하여 출력하도록 끝 부분에 pretty구문 추가

PUT 명령어 실행 시

{
  "acknowledged": true,
  "shards_acknowledged": true,
  "index": "customer"
}
  • acknowledged: 응답 결과 정상
  • shard_acknowledged:
  • index: 생성된 데이터베이스명

GET 명령어로 index 전체 조회

GET /_cat/indices?v
  • 전체 인덱스를 조회

GET 명령어 실행 시

health status index                             uuid                   pri rep docs.count docs.deleted store.size pri.store.size
green  open   .geoip_databases                  ''                     1   0         43           40     40.8mb         40.8mb
... 중략
  • _cat 명령어를 사용하여 전체 index(데이터베이스)를 조회 한다.

POST 명령어 사용하여 데이터 삽입

POST customer/type1/1
{
  "name": "ymkim"
}

POST 명령어 실행 시

{
  "_index" : "customer",
  "_type" : "type1",
  "_id" : "1", # document => 지정하지 않을 시 랜덤으로 들어간다
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}

DELETE 명령어로 데이터 삭제

DELETE customer/type1/1

DELETE 명령어 실행 시

{
  "_index" : "customer",
  "_type" : "type1",
  "_id" : "1",
  "_version" : 2,
  "result" : "deleted", # 삭제 여부
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 1,
  "_primary_term" : 1
}

Document의 일부분을 변경

# 아래 명령어를 통해 document의 일부분을 변경할 수 있다
POST customer/type1/1/_update
{
  "doc" : {
    "age" : 123
  }
}

# 해당 명령어는 document 전체를 갈아끼우는 방법이다, 지양해야할 것 같다
POST customer/type1/1
{
  "name": "ymkim"
}

Elasticsearch script 사용

POST customer/type1/1/_update
{
  "script" : {
    "inline": "if(ctx._source.age==123) {ctx._source.age++}"
  }
}
  • 위와 같이 Javascript 구문을 사용하여 데이터를 핸들링 할 수 있다.

참고 자료

댓글남기기