ElasticSearch Getting Started - 2

2017. 6. 28. 16:08DB&NoSQL/Elasticsearch,ELK

여러분의 데이터 수정하기(Modifying your Data)

Elasticsearch는 데이터 조종(data manipulation) 과 실시간에 가깝게 검색 능력을 제공합니다. 
기본적으로, 여러분의 데이터를 인덱스/수정/삭제 하는 시간부터 여러분의 검색 결과들이 나타나는 시간까지
1초 지연시간(새로고침 간격)를 예상할 수 있습니다.
이건 트렌젝션을 완료한 후에 데이타가 즉시 사용가능한 SQL 같은 다른 플렛폼과는 다른   중요한 특징(important distinction) 입니다. 

indexing/Replacing Documents

앞서 싱글 document에 인덱스를 걸수 있는 법을 봤습니다.
다시 그 명령을 재 호출 해봅니다.

PUT /customer/external/1?pretty
{
  "name": "John Doe"
}

다시, 위의 예에서 지정된 문서를 ID가 1인 customer index(external type)로 인덱싱합니다.
다른 혹은 같은 document을 가지고 위의 명령을 다시 실행하면,
Elasticsearch는 새로운 document를 IO가 1인 앞선 cusomter index의 상단에 배치합니다.

PUT /customer/external/1?pretty
{
  "name": "Jane Doe"
}

위의 예제에서는 ID가 1인 document의 이름이 "John Doe" 에서 "Jane Doe" 로 변경되었습니다.
만약에  우리가 다른 ID를 사용한다면, 새로운 document가 인덱싱될것이고, 기존 document는 아무런 변화없이 남아있을 것입니다. 

PUT /customer/external/2?pretty
{
  "name": "Jane Doe"
}

위의 예제는 ID가 2인 새로운 document로 인덱싱됩니다.

인덱싱할때, ID 부분은 옵션입니다.
명시하지 않으면, Elasticsearch 는 랜덤 ID를 생성하고, document를 인덱스 하는데 이 ID를 사용합니다.
Elasticsearch가 생성하는  실제 ID (또는 앞선 예제에서 명료하게 지정하던지)를 index API 호출의 일부분으로 리턴합니다.

이 예제는 명백한(explicit) ID가 없이 document를 인덱싱하는 방법을 보여줍니다.

POST /customer/external?pretty
{
  "name": "Jane Doe"
}

ID를 지정하지 않을때는 , PUT 대신에 POST를 사용했다는 점을 기억해주시길.

Updating Document

Document를 인덱싱하거나 바꾸는 것이 가능한것에 더해, 우리는 document를 업데이트(수정) 할수도 있습니다.
Elasticsearch는 실제로 내부 업데이트를 수행하지 않습니다.
우리가 업데이트를 할때마다, Elasticsearch는 이전 document를 삭제하고, 한샷에 업데이트된 것이 적용된 새로운  document를 인덱싱 합니다. 

이 예제는 이전 document(ID of 1)을 이름 필드를 "Jane Doe"를 변경하는 것으로  업데이트하는 방법을 보여줍니다.

POST /customer/external/1/_update?pretty
{
  "doc": { "name": "Jane Doe" }
}

이번 예제에서는 이름을 "Jane Doe" 에다가 , 나이 필드를 추가해보도록 하겠습니다.

POST /customer/external/1/_update?pretty
{
  "doc": { "name": "Jane Doe", "age": 20 }
}

간단한 스크립트를 사용하여 동작하게 할수도 있습니다.
나이를 5살 올리는 스크립트를 사용하는 예제입니다.

POST /customer/external/1/_update?pretty
{
  "script" : "ctx._source.age += 5"
}

위의 예제에서, ctx._source 는 막 수정된 현재 소스 document를 참조합니다.

업데이트는 한번에 하나의 싱글 document만 동작합니다.
먼 훗날에, Elasticsearch는 다수의 document를 수정할수 있는 능력을 제공할 것입니다. 쿼리 조건문등 같은 걸로

Deleting Documents

document를 삭제하는 것은 꽤 수월합니다.(straightforward)
이 예제는 앞서서 만든 ID 1,2 를 갖는 customer를 삭제하는 방법을 보여줍니다.

DELETE /customer/external/2?pretty

지정된 쿼리와 매칭하는 모든 documents를 삭제하는 방법은 아래 "Delete By Query API"를 참고하세요.
Delete By Query API를 가지고 모든 documents 를 삭제하는 것 대신에, 전체 인덱스를 삭제하는 것이 보다 효율적인것에
보다 가치가 있다는 점이다.

Batch Processing

개별적인 document들을 인덱싱, 수정, 삭제 을 할 수 있는것 외에도, Elasticsearch는 _bulk API를 사용하여 위의 어떤 동작이라도
배치상에서 구동할수 있는 능력을 제공합니다.
이 기능은 다수의 동작은 가능한 약간의 네트워크 라운드트립상에서 가능한 빠르게 매우 효율적인 매카니즘을 제공하는 것으로 중요합니다.

빠른 예제로, 아래 호출은 하나의 벌크 동작으로  두개의 documents(ID 1 - John Doe, Id2 - Jane Doe 를 인덱싱합니다. 

POST /customer/external/_bulk?pretty
{"index":{"_id":"1"}}
{"name": "John Doe" }
{"index":{"_id":"2"}}
{"name": "Jane Doe" }

아래 예제는 첫번째 document를 수정하고 두번째 document를 삭제하는데, 한 벌크 동작으로 진행됩니다.

POST /customer/external/_bulk?pretty
{"update":{"_id":"1"}}
{"doc": { "name": "John Doe becomes Jane Doe" } }
{"delete":{"_id":"2"}}

위 삭제 작업의 경우,  deletes은 오직 삭제될 document의 ID만 요구것 부터 어떤 연관소스 document가 없다는 것을 명심하세요
(Note above that  for the delete action,
 there is no corresponding source document after it since deletes only require the ID of the document to be deleted)

Bulk API는 액션들중에 하나가 실패하는 것 때문에 실패하지 않습니다.
무슨 이유에서든 하나의 액션이 실패했다면, 후에 나머지 액션들을 처리하는 것을 진행할 것입니다.
Bulk API가 리턴할때, 각각의 액션에 대한 상태를 제공합니다 그래서 여러분은 특정 액션이 실패했는지 아닌지 여부를 확인 할수 있습니다.