욱'S 노트

Elasticsearch - Modifying Your Data 본문

Programming/Elasticsearch

Elasticsearch - Modifying Your Data

devsun 2015. 5. 27. 15:32

엘라스틱 서티는 NRT상의 데이터 조작과 검색 기능을 제공한다. 기본적으로 데이터를 입력/변경/삭제하고 조회 결과에 나타날때까지 1초의 딜레이가 예상된다. 이것은 트랜잭션이 완료되면 즉시 조회가 가능한 SQL 기반의 다른 플랫폼과의 주요한 차이점이다.


Indexing/Replacing Documents


하나의 도튜먼트를 인덱싱 해보기 위해 다시 아래와 같은 커맨드를 수행해보자,


curl -XPUT 'localhost:9200/customer/external/1?pretty' -d '

{

  "name": "John Doe"

}'


다시 customer 인덱스, external 타입에 ID 1로 도큐먼트가 인덱싱 되었다. 만약 다른 도큐먼트로 위의 커맨드를 다시 실행한다면 엘라스틱 서치는 ID 1에 존재하는 도큐먼트를 새로운 도큐먼트로 대체할 것이다.


curl -XPUT 'localhost:9200/customer/external/1?pretty' -d '

{

  "name": "Jane Doe"

}'


ID 1에 저장된 도큐먼트의 이름이 "John Doe" 에서 "Jane Doe"로 변경 될 것이다. 만약 다른 아이디를 사용한다면 새로운 도큐먼트가 인덱스되고 기존의 이미 존재하는 도큐먼트는 변경되지 않을 것이다.


curl -XPUT 'localhost:9200/customer/external/2?pretty' -d '

{

  "name": "Jane Doe"

}'


위의 명령의 결과로 ID 2에 새로운 도큐먼트가 인덱스 될 것이다. 


인덱싱을 할때 ID 부분은 옵션이다. 만약 명시하지 않는다면 엘라스틱 서치는 도큐먼트를 인덱스하기 위해 랜덤한 ID를 생성할 것이다. 엘라스틱 서치가 생성한 아이디는 인덱스 API 호출결과로 반환할 것이다.


다음 예제는 명시적인 아이디 없이 도큐먼트를 인덱스하는 것이다.


curl -XPOST 'localhost:9200/customer/external?pretty' -d '

{

  "name": "Jane Doe"

}'


위의 케이스에서 ID를 명시하지 않기 때문에 PUT절 대신 POST절을 사용해야 한다.


Updating Documents


추가적으로 도큐먼트를 인덱스하거나 대체하는 것 외에 또한 도큐먼트에 대한 업데이트를 수행할 수 있다. 그러나 실제적으로 엘라스틱서치에서는 내부적으로 in-place 업데이트를 수행하지는 않는다. 업데이트를 수행하면 엘라스틱 서치는 오래된 도큐먼트를 지우고 업데이트된 새로운 도큐먼트를 인덱스 한다.


이번 예제에서는 어떻게 기존 도큐먼트를 업업데이트 하는지를 보여준다.


curl -XPOST 'localhost:9200/customer/external/1/_update?pretty' -d '

{

  "doc": { "name": "Jane Doe" }

}'


이번 예제는 기존 도큐먼트를 이름을 변경하고 age를 추가하는 업데이트를 수행한 예이다.


curl -XPOST 'localhost:9200/customer/external/1/_update?pretty' -d '

{

  "doc": { "name": "Jane Doe", "age": 20 }

}'


업데이트는 간단한 스크립트를 이용하여 수행될 수 있다. 다음과 같은 다이나믹 스크립트는 1.4.3에서는 비활성화 되어 있다. 자세한 내용은 스크립트 관련 자료를 자세히 살펴 보도록 하자. 이번 예제는 스크립트를 이용해 나이를 5 증가 시키는 예제이다.


curl -XPOST 'localhost:9200/customer/external/1/_update?pretty' -d '

{

  "script" : "ctx._source.age += 5"

}'


위의 예에서 ctx._source는 업데이트를 하기 위해 현재 문서를 레퍼런스 한다.


현재 시점에서 업데이트는 한번에 하나의 도큐먼트에 대해서만 수행할 수 있다. 그러나 미래에는 엘라스틱 서치에서는 주어진 쿼리 조건에 따라 다수의 문서를 업데이트할 수 있는 기능을 제공할 것이다.  (like an SQL UPDATE-WHERE statement)


Deleting Documents


도큐먼트 삭제는 완전히 단반향이다.


curl -XDELETE 'localhost:9200/customer/external/2?pretty'


우리는 또한 쿼리 조건에 의해 다수의 도큐먼트를 삭제할 수 있다. 이번 예제는 이름에 John을 포함하고 있는 모든 고객을 삭제하는 것이다. 


curl -XDELETE 'localhost:9200/customer/external/_query?pretty' -d '

{

  "query": { "match": { "name": "John" } }

}'


위의 URI가 /_query로 변경된 것에 주의하자. 그리고 본문에 삭제 쿼리 기준이 명시되었다. 그리고 삭제를 위해 DELETE 절이 여전히 사용되고 있다. 쿼리 문법에 대한 내용은 나중에 자세히 살펴보겠다.


Batch Processing


개별적인 도큐먼트를 인덱스, 업데이트 및 삭제를 수행하는 것 외에 엘라스틱 서치에서는 _bulk API를 사용해서 배치 오퍼레이션을 수행할 수 있다. 이 기능은 중요한데 네트워크 라운드 트립을 감소시켜 더 빠르게 연산을 가능하게 해준다.


간단한 예로 두개의 도큐먼트를 하나의 오퍼레이션으로 벌크 처리를 수행해보겠다. 


curl -XPOST 'localhost:9200/customer/external/_bulk?pretty' -d '

{"index":{"_id":"1"}}

{"name": "John Doe" }

{"index":{"_id":"2"}}

{"name": "Jane Doe" }

'


이번 예제는 첫번째 도큐먼트를 업데이트 하고 두번째 도큐먼트를 삭제하는것을 하나의 벌크 오퍼레이션에서 수행하는 것이다.


curl -XPOST 'localhost:9200/customer/external/_bulk?pretty' -d '

{"update":{"_id":"1"}}

{"doc": { "name": "John Doe becomes Jane Doe" } }

{"delete":{"_id":"2"}}

'


삭제를 위한 액션을 위해서는 삭제를 하기 위한 ID정보를 명시한 도큐먼트만 있으면 된다는 점을 주의하자.


벌크 API는 모든 액션을 순서에 따라 시퀀셜하게 수행한다. 만약 어떤 이유에서건 하나의 액션이 실패하면 그 후에 액션들은 계속 수행될 것이다. 벌크 API의 결과가 반환될 때 각 액션에 대한 상태가 제공될 것이다.

'Programming > Elasticsearch' 카테고리의 다른 글

Elasticsearch - Mapping  (0) 2015.05.28
Elasticsearch - API Conventions  (0) 2015.05.28
Elasticsearch - Exploring Your Data  (0) 2015.05.27
Elasticsearch - Exploring Cluster  (0) 2015.05.22
Elasticsearch - 시작하기  (1) 2015.05.20
Comments