Architecture/ELK

Elastic Stack 아주 조금만 알아보자 - ElasticSearch 기본 실습

KOOCCI 2019. 11. 20. 01:27

GET 부터 검색 시작

앞선 포스트에서, 우리는 다음과 같은 테이블을 보았다.

ElasticSearch RDB
GET Select
PUT Update
POST Insert
DELETE Delete

따라서, GET으로 검색을 해보도록 하자.

GET

curl -XGET http://localhost:9200/classes
curl -XGET http://localhost:9200/classes?pretty

위 명령어를 통해, 우리는 curl을 사용하여 GET을 해오고 있다는 것을 볼 수 있다.

향후, 모든 Method활용에서 동일하겠지만, classes라는 index에 대해 요청하는 내용이며, pretty라는 파라미터를 통해 이를 이쁘게 보여줄 수 있다.

{
  "error" : {
    "root_cause" : [
      {
        "type" : "index_not_found_exception",
        "reason" : "no such index [classes]",
        "resource.type" : "index_or_alias",
        "resource.id" : "classes",
        "index_uuid" : "_na_",
        "index" : "classes"
      }
    ],
    "type" : "index_not_found_exception",
    "reason" : "no such index [classes]",
    "resource.type" : "index_or_alias",
    "resource.id" : "classes",
    "index_uuid" : "_na_",
    "index" : "classes"
  },
  "status" : 404
}

위 결과값에서 404 status가 나온 것을 통해, 아직 classes라는 index가 없다는 것을 알 수 있다.

 

PUT 으로 생성

GET으로 아직 classes라는 index가 없는 것을 알았으니, PUT으로 생성을 해보자.

 

PUT

curl -XPUT http://localhost:9200/classes
{
  "classes" : {
    "aliases" : { },
    "mappings" : { },
    "settings" : {
      "index" : {
        "creation_date" : "1574178750443",
        "number_of_shards" : "1",
        "number_of_replicas" : "1",
        "uuid" : "79MBiumdQAqdLjgIx85ZqA",
        "version" : {
          "created" : "7040299"
        },
        "provided_name" : "classes"
      }
    }
  }
}

더 이상, 404 status가 나오지 않으며, classes라는 index가 생성되었다는 것을 볼 수 있다.

DELETE 로 삭제까지

PUT으로 생성을 진행했으니, 이제는 삭제를 해보자.

DELETE

curl -XDELETE http://localhost:9200/classes
{
  "error" : {
    "root_cause" : [
      {
        "type" : "index_not_found_exception",
        "reason" : "no such index [classes]",
        "resource.type" : "index_or_alias",
        "resource.id" : "classes",
        "index_uuid" : "_na_",
        "index" : "classes"
      }
    ],
    "type" : "index_not_found_exception",
    "reason" : "no such index [classes]",
    "resource.type" : "index_or_alias",
    "resource.id" : "classes",
    "index_uuid" : "_na_",
    "index" : "classes"
  },
  "status" : 404
}

위와 같이, 삭제를 진행하면 다시 status가 404로 바뀌며 해당하는 index가 없다는 내용을 확인할 수 있다.

POST 로 Document 만들기

PUT으로 index를 생성해보았다. 이제는 POST로 실제 Document를 만들 것이다.

단, 이 때 index가 없다면, 자동으로 생성이 되니 유의하도록 하자.

 

POST

curl -XPOST http://localhost:9200/classes/class/1 -H'Content-Type: application/json' -d '{"title": "Algorithm", "professor": "John"}'
curl -XGET http://localhost:9200/classes/class/1?pretty
{
  "_index" : "classes",
  "_type" : "class",
  "_id" : "1",
  "_version" : 4,
  "_seq_no" : 3,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "title" : "Algorithm",
    "professor" : "John"
  }
}

주의해서 보면, -H라는 argument를 하나더 추가했다는 것을 알 수 있다.

일반 실습 영상에서는 없었으나, Elasticsearch 6.0 이후 버전에 도입된 엄격한 content-type 확인으로 인해서 추가해야 한다.

 

 

추가로, 우리가 argument로 document를 등록하는 경우는 거의 없고, 보통 파일을 사용하는데 이 때는 다음과 같이 가능하다.

POST by FILE

curl -XPOST http://localhost:9200/classes/class/1 -H'Content-Type: application/json' -d@new_class.json
{
  "title": "Machine Learning",
  "Professor": "Minsuk Heo",
  "major": "Computer Science",
  "semester": ["spring", "fall"],
  "student_count": 100,
  "unit": 3,
  "rating": 5
}

new_class.json 파일에는 위 내용이 들어있으며, 이를 등록한 것을 위 이미지에서 볼 수 있다.

 

POST 로 Update를 좀 더 알아보자.

POST로 Document가 등록되어 있을 때, 이것을 어떻게 Update할 수 있을까?

앞서, 실습했던 내용들을 DELETE하고 다시 하나씩 진행해보자.

 

DELETE & POST

일단 Update를 진행할 내용을 미리 등록해두었다.

이제 기존 등록된 내용을 그대로 두고, 내용을 추가할 것이다.

 

UPDATE

curl -XPOST http://localhost:9200/classes/class/1/_update -H'Content-Type: application/json' -d '{"doc": {"unit" :1}}'
{
  "_index" : "classes",
  "_type" : "class",
  "_id" : "1",
  "_version" : 2,
  "_seq_no" : 1,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "title" : "Algorithm",
    "professor" : "John",
    "unit" : 1
  }
}

위 명령어를 통해 unit이라는 것이 1로 등록된 것을 볼 수 있다. 만약, 다시 2로 수정하고 싶으면 아래 명령어를 그대로 쓰면 된다.

curl -XPOST http://localhost:9200/classes/class/1/_update -H'Content-Type: application/json' -d '{"doc": {"unit" :2}}'

또한, 현재 내용에서 값을 추가하고 싶을 때는 다음과 같이 코드처럼 쓸 수도 있다.

UPDATE SCRIPT

curl -XPOST http://localhost:9200/classes/class/1/_update -H'Content-Type: application/json' -d '{"script":"ctx._source.unit += 5"}'

{"script":"ctx._source.unit += 5"}

위 수식을 통해, 현재 unit에 들어 있는 값에 +5 를 진행한 예제이다.

 

POST 로 BULK 데이터를 올려보자.

먼저, 명령어는 다음과 같다.

curl -XPOST http://localhost:9200/_bulk?pretty -H'Content-Type: application/json' --data-binary @classes.json

위 명령어에서 classes.json에는 bulk 데이터가 다음과 같이 들어있다.

 

BULK DATA

{ "index" : { "_index" : "classes", "_type" : "class", "_id" : "1" } } {"title" : "Machine Learning","Professor" : "Minsuk Heo","major" : "Computer Science","semester" : ["spring", "fall"],"student_count" : 100,"unit" : 3,"rating" : 5, "submit_date" : "2016-01-02", "school_location" : {"lat" : 36.00, "lon" : -120.00}}

한개 예시만 보면, index이름, id등을 지정하고, 거기에 들어갈 document 내용들이 들어가게 된다.

그 결과 위와 같이, 정상적으로 삽입이 된 것을 확인할 수 있다.

 

그럼 다음 포스팅부터는 RDB에서 SCHEMA에 해당하는 Mapping에 대해 알아보도록 하겠다.


※ Inflearn 강의, Naver D2 블로그 등을 참고해 정리한 내용입니다.

 

1편 > Elastic Stack 아주 조금만 알아보자 - Elastic Stack 이란?

2편 > 현재 Post

3편 > Elastic Stack 아주 조금만 알아보자 - ElasticSearch Mapping/Search

4편 > Elastic Stack 아주 조금만 알아보자 - ElasticSearch 구조

5편 > Elastic Stack 아주 조금만 알아보자 - Aggregation

6편 > Elastic Stack 아주 조금만 알아보자 - Kibana

7편 > Elastic Stack 아주 조금만 알아보자 - LogStash

8편 > Elastic Stack 아주 조금만 알아보자 - LogStash 실습 1