Skip to main content

Elasticsearch 7.3 활용해보기 #4

DB라면 기본적인 CRUD를 만들어봅시다. Elasticsearch는 RestAPI 다루듯이 쿼리한다고 생각하면 접근이 쉽습니다. 실제로 http 프로토콜로도 쿼리가 가능해서 서버에서 cros 접근설정이 되어있다면, Javascript로도 충분히 컨트롤이 가능하지요..

RestAPI에서 데이터를 가져올때 GET, 추가할때 POST, 삭제할때 DELETE, 수정할때 PUT을 사용하는 것처럼 Elasticsearch에서도 동일하게 사용됩니다

Elasticsearch에서는 index가 DB의 역할을 함으로 데이터를 추가하기위해서는 먼저 정의해야합니다. mapping을 통해 특별한 구조를 줄수도 있고 #3에서 처럼 Analyzer를 추가하여 단어의 색인 방법을 추가할 수도 있습니다.

index 생성

index를 추가하는 방법은 간단합니다.

PUT my_index
{

}

Kibana console에서 HTTP메서드인 PUT으로 간단히 이름만 적어줘도 생성되게 됩니다.

{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "index" : "my_index"
}

문서(Document) 추가하기

만들어진 index에 문서를 추가해보면, 다음과 같이 작성할 수 있습니다. 원래는 _doc대신에 type(mapping정보?? info?? )가 들어갔으나, 7.0 이후로는 무형식API로 _doc로만 적어준다고합니다. ( https://www.elastic.co/kr/blog/moving-from-types-to-typeless-apis-in-elasticsearch-7-0 )

POST my_index/_doc
{
  "name":"안주성",
  "age":"21",
  "gender":"남자"
}

추가된 결과는 다음처럼 나타납니다. _id는 특별히 부여하지 않았기 때문에 랜덤형식으로 나타나게 됩니다. _id를 지정하게 된다면 my_index/_doc/1 처럼 지정할 수 있습니다. _id는 문서를 컨트롤하는데 사용되게 됩니다.

{
  "_index" : "my_index",
  "_type" : "_doc",
  "_id" : "VtJO8mwBjjMy29RvFDdO",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 2,
  "_primary_term" : 1
}

문서를 리스트로 불러오기

추가된 문서를 확인하기 위해서는 GET메서드를 사용합니다. _search로 호출되게 되며, 여러가지 검색조건을 덧붙일 수도 있습니다.(추후에 자세히 … 지금은 연습니니깐 -_- )

GET my_index/_search
{
  
}

응답은 다음과 같습니다. 불러다 쓸때는 hits.hits._source로 접근하여 실제 데이터를 가져다 쓸수있습니다.

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "VtJO8mwBjjMy29RvFDdO",
        "_score" : 1.0,
        "_source" : {
          "name" : "안주성",
          "age" : "21",
          "gender" : "남자"
        }
      }
    ]
  }
}

하나의 문서 불러오기

이번에는 하나의 문서만 호출해봅시다. 하나의 문서를 호출하기 위해서는 _id를 알고 있어야합니다. 다음같이 쿼리해봅니다. (주의할점은 여기에 {}를 주면 PUT 도 아닌데 문서가 갱신되게 되더군요 )

GET my_index/_doc/VtJO8mwBjjMy29RvFDdO

그러면 결과는… 해당 문서의 _source로 접근해 데이터를 가져올 수 있습니다.

{
  "_index" : "my_index",
  "_type" : "_doc",
  "_id" : "VtJO8mwBjjMy29RvFDdO",
  "_version" : 1,
  "_seq_no" : 3,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "name" : "안주성",
    "age" : "21",
    "gender" : "남자"
  }
}

문서의 갱신

문서를 갱신해봅시다. 문서갱신은 index생성과 마찬가지로 PUT메서드를 사용합니다. 다른점은 _id가 호출 주소에 덧붙여져 있습니다.

PUT my_index/_doc/VtJO8mwBjjMy29RvFDdO
{
  "name" : "안주섬",
  "age" : "39",
  "gender" : "남자"
}

정상적으로 갱신되었다면… _version이 증가하고 성공 메시지를 볼수 있습니다.

{
  "_index" : "my_index",
  "_type" : "_doc",
  "_id" : "VtJO8mwBjjMy29RvFDdO",
  "_version" : 2,
  "result" : "updated",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 3,
  "_primary_term" : 1
}

다시 GET으로 확인해보면.. 데이터가 갱신 된것을 확인할 수 있습니다.

{
  "_index" : "my_index",
  "_type" : "_doc",
  "_id" : "VtJO8mwBjjMy29RvFDdO",
  "_version" : 2,
  "_seq_no" : 3,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "name" : "안주섬",
    "age" : "39",
    "gender" : "남자"
  }
}

문서의 삭제

문서의 조회와 유사하게 DELETE메서드를 통해 문서를 삭제할 수 있습니다.

DELETE my_index/_doc/VtJO8mwBjjMy29RvFDdO

잘 삭제되었다면,

{
  "_index" : "my_index",
  "_type" : "_doc",
  "_id" : "VtJO8mwBjjMy29RvFDdO",
  "_version" : 3,
  "result" : "deleted",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 5,
  "_primary_term" : 1
}

다시 GET으로 해당 ID를 확인해보면.. 찾을 수 없다고 나옵니다. ㅎ

{
  "_index" : "my_index",
  "_type" : "_doc",
  "_id" : "VtJO8mwBjjMy29RvFDdO",
  "found" : false
}

index 삭제

index도 삭제해봅시다.

DELETE my_index

정말 간단하게 삭제되는군요….

{
  "acknowledged" : true
}

여기까지 입니다. -ㅅ-) …

다음에는 index/_search 의 상세조건알 알아봐야겠네요…

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.