글 작성자: nouu

http://www.yes24.com/Product/Goods/103030516

 

엘라스틱 스택 개발부터 운영까지 - YES24

데이터를 처리하는 데 서로 잘 맞지도 않는 오픈소스 기술들을 굳이 동원해야 할까? 제각각인 오픈소스들을 통합하고 운영하느라 지친 개발자와 운영자들을 위한 솔루션! 이제 엘라스틱 스택

www.yes24.com

 

해당 서적을 참고하여 글을 작성하였습니다. 

 

도큐먼트는 반드시 하나의 인덱스에 포함해야 되기 때문에 도큐먼트를 동작하기 위해서는 인덱스가 있어야 한다. 먼저 인덱스를 키바나 콘솔을 이용하여 작성해보자. 

 

PUT index1 #index1 이라는 이름의 인덱스를 생성하는 REST API 문이다. 그 결과 다음과 같이 우측에 index1이 만들어 졌다는 결과가 JSON 형식을 통해 나온다. 

 

 

GET index1 #index1을 확인하는 API다. 키바나 콘솔에서 결과창을 확인하면 index1의 인덱스 설정 값이나 매핑 값을 확인 할수 있다. 

 

DELETE index1 # index1이 삭제되었다. 방금 만들었던 index1은 도큐먼트가 하나도 없지만 인덱스를 삭제한다면 인덱스 내에 저장되어 있던 도큐먼트들도 모두 삭제가 된다. 

 

 

 

 

 

엘라스틱서치에서 도큐먼트를 인덱스에 포함시키는 것을 인덱싱이라고 한다. 

 

 

다음과 같이 index2 인덱스를 생성하면서 동시에 index2 인덱스에 도큐먼트를 인덱싱 할 수 있다. 

 

PUT index2/_doc/1

{

 "name" : "mike",

 "age" : 25,

 "gender" : "male"

}

 

index2는 인덱스 이름, _doc은 엔드포인트 구분에 대한 API, 1은 인덱싱 했던 도큐먼트의 고유 아이디이다. 도큐먼트에는 각각 name, age, gender 필드가 있으며, 필드 스키마에 대한 적절한 값이 있다. 

 

index2 인덱스는 매핑을 보면 알 수 있듯이 age는 long 타입이며, gender와 name은 text 타입으로 필드가 지정되어 있다.

 

우리가 데이터 타입을 지정하지 않아도 엘라스틱서치는 도큐먼트의 필드와 값만 보고 자동으로 데이터 타입을 알 수 있는데, 이것을 다이나믹 매핑이라고 한다. 

 

 

index2에 다음과 같이 추가적으로 도큐먼트를 인덱싱하였다. 

 

 

서로 다른 스키마를 가진 도큐먼트를 하나의 인덱스로 넣는 것은 바람직하지 않지만 어쨋든 문제없이 인덱싱이 잘 되는 것을 볼 수 있다. 

 

즉, 다음과 같은 인덱스와 도큐먼트로 구성된다. 

 

 

도큐먼트를 읽는 방법은 크게 도큐먼트 아이디를 이용하여 조회하는 방법과 쿼리 DSL(Domain Specific Language)라는 엘라스틱서치가 제공하는 쿼리문을 이용하는 방법이 있다. 

 

도큐먼트 아이디를 이용하는 방법은 다음과 같다. 

 

GET index2/_doc/1 #인덱스명과 도큐먼트 아이디를 이용하여 특정 도큐먼트의 데이터를 가져올 수 있다.

 

GET index2/_search # DSL 쿼리를 이용하여 index2의 전체 도큐먼트를 가져오는 api이다. 

 

 

이제 도큐먼트를 수정해보자. 다음과 같이 도큐먼트 아이디 1번에 새로운 필드들과 값을 할당하면 기존 1번 도큐먼트의 name과 age 필드 값이 변경된다. 도큐먼트를 인덱싱하는 과정에서 같은 도큐먼트 아이디가 있으면 덮어쓰기 되는 것인데 마치 도큐먼트가 업데이트가 되는 것 처럼 보인다. 

 

_update api를 이용하여 특정 도큐먼트 값을 업데이트 할 수 있다. 

 

 

POST index2/_update/1

{

 "doc" : {

    "name" : "lee"

    }

}

 

_update api라는 엔드포인트를 추가하여 특정 필드 값만 업데이트 가능하다. 

 

 

엘라스틱서치는 로그 수집 용도로 사용한다면 개별 도큐먼트를 수정할 일은 거의 없다. 개별 도큐먼트 수정이 많은 작업이라면 엘라스틱서치가 아닌 데이터베이스를 이용하는게 좋다. 

 

 

 

마지막으로 도큐먼트를 삭제하는 구문이다. 

DELETE index2/_doc/2 

 

GET index2/_search를 통해 index2 인덱스의 전체 도큐먼트를 확인해보면 2번 도큐먼트가 보이지 않을 것이다.