08. Update API :: 2015/05/20 13:07

Update API 제공된 script 따라 document를 업데이트한다. Operation index로부터 document 조회하고 script 실행하여 결과를 index 저장한다. 물론 조회나 reindex하는 과정에서 업데이트가 없다는 것은 버전으로 확인할 있다.


operation document full reindex 의미하며, network roundtrip 제거하고 get operation index사이에 버전 변경으로 인한 충돌을 감소시켜야 함에 유의하라. 이러한 특징을 해결하기 위해서 _source field 필요하다.


예를 들어 다음 간단한 document index해보자.


curl -XPUT localhost:9200/test/type1/1 -d '{
  
"counter" : 1,
  
"tags" : ["red"]
}'


이제 counter 증가시키는 script 실행할 있다.


curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{
  
"script" : "ctx._source.counter += count",
  
"params" : {
      
"count" : 4
  
}
}'


또한 태그 리스트에 태그를 추가할 수도 있다. (만약 태그가 존재하더라도 리스트이기 때문에 추가된다.)


curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{
  
"script" : "ctx._source.tags += tag",
  
"params" : {
      
"tag" : "blue"
  
}
}'


Document 새로운 field 추가할 있다.


curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{
  
"script" : "ctx._source.name_of_new_field = \"value_of_new_field\""
}'


Document로부터 field 삭제할 수도 있다.


curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{
  
"script" : "ctx._source.remove(\"name_of_field\")"
}'


태그가 blue document 삭제하거나, blue 아닐 경우 삭제하지 않을 수도 있다.


curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{
  
"script" : "ctx._source.tags.contains(tag) ? ctx.op = \"delete\" : ctx.op = \"none\"",
  
"params" : {
      
"tag" : "blue"
  
}
}'


[NOTE]

3 operator assignment 다루는 것을 알아야 한다. Assignment operation 3 operator 비해서 우선순위가 낮다. 다음 항목들을 비교해 보자.


// Will NOT update the tags array
ctx
._source.tags.contains(tag) ? ctx.op = \"none\" : ctx._source.tags += tag
// Will update
ctx
._source.tags.contains(tag) ? (ctx.op = \"none\") : ctx._source.tags += tag
// Also works
if (ctx._source.tags.contains(tag)) { ctx.op = \"none\" } else { ctx._source.tags += tag }


Update API 통해서 또한 document 일부분만 전송할 있다. 전송된 내용은 이미 존재하는 document merge된다. (간단히 말하자면 recursive merge, object inner merge, "key/value" array replace하는 것이다.)


예를 들면 다음과 같다.


curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{
  
"doc" : {
      
"name" : "new_name"
  
}
}'


Doc script 지정하면 doc은 무시된다. Script내에 document 일부분에 해당하는 field pair 넣는 것이 가장 좋다. 기본적으로 doc 지정되면, document merge process 어떤 변화를 일으키지 않더라도 항상 update된다. Detect_noop true 설정하면 Elasticsearch에서 변경사항이 있는지를 체크하고 아니면 update request noop 된다. 예를 들면 다음과 같다.


curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{
  
"doc" : {
      
"name" : "new_name"
  
},
  
"detect_noop": true
}'


Request 보내지기 전에 name new_name이라면 전체 update request 무시한다.


Upserts


Elasticsearch Update API에는 upsert도 있다. Document 이미 존재하지 않으면, upsert element content 새로운 document index 것이다.


curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{
  
"script" : "ctx._source.counter += count",
  
"params" : {
      
"count" : 4
  
},
  
"upsert" : {
      
"counter" : 1
  
}
}'


Document 없으면 스크립트를 통해서 client에는 알려지지 않은 business logic 사용하여 document content 초기화하도록 있다. 이런 경우에는 새로운 scripted_upsert parameter true 설정하면 된다.


curl -XPOST 'localhost:9200/sessions/session/dh3sgudg8gsrgl/_update' -d '{
  
"script_id" : "my_web_session_summariser",
  
"scripted_upsert":true,
  
"params" : {
      
"pageViewEvent" : {
              
"url":"foo.com/bar",
              
"response":404,
              
"time":"2014-01-01 12:32"
      
}
  
},
  
"upsert" : {
  
}
}'


Default scripted_upsert 설정은 false이다. 이것은 script insert 위해서는 실행되지 않음을 의미한다. 그러나 위와 같은 시나리오에서처럼 새로운 "indexed scripts" feature 이용하여 저장된 중요한 (non-trivial) script 사용할 있다. 스크립트를 통해서 여러 page view event 기반한 web session 기간 (duration) 같은 특징들을 뽑아낼 수도 있다. Client에서는 blank "upsert" document 제공하거나 params element 넘겨진 event 사용하여 최대한 상세하게 채워서 script 실행할 수도 있다.


마지막으로 upsert 기능은 doc_as_upsert 지원한다. 제공된 document 기존에 존재하지 않는 document 경우에 insert된다. 이것은 Elasticsearch 전송되는 데이터의 양을 감소시킬 것이다.


curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{
  
"doc" : {
      
"name" : "new_name"
  
},
  
"doc_as_upsert" : true
}'


Parameters


Update operation index API처럼 유사한 parameter 지원한다.


Routing : document 적합한 shard route하는데 사용하는 설정

Parent : routing 단순 설정

Timeout : shard 다시 사용가능해질 때까지 기다리는 시간

Replication : delete/index operation (sync, async) 대한 replication type. 1.5.0에서 deprecated.

Consistency : index/delete operation write consistency

Refresh : 전체 index 아니라 적합한 primary replica shard operation 발생한 이후 즉시 refresh. 따라서, update document 바로 검색 결과로 나타난다.

Fields : update document로부터 적합한 fields 리턴. 전체 update source 리턴하기 위해서 _source 지원.

Version & version_type : Update API Elasticsearch 내부에서 지원하는 versioning을 사용함. Update되는 동안 document 변경되지 않았음을 version으로 판별. 특정 version document update하기 위해서 version parameter 사용할 수도 있음. Version type force 설정하면 강제로 document update하고 새로운 version 부여됨. (사용하는데 주의할 ! Force 사용하면 document 변경되지 않았음을 보증할 없음.) external & external_gte version type 지원되지 않음


조회한 document 그것을 indexing / deleting하는 사이에 version 충돌이 발생하면 몇번이나 retry해야 하는지를 설정하는 Retry_on_conflict 지원한다. Default 0이다.


또한 ctx._ttl 사용하여 document ttl update 있다. 그리고 ctx._timestamp 사용하여 document timestamp update 있다. 만약 timestamp update되지 않았고, _source로부터 추출된다면 update date 설정할 것이다.


_source 추가로 다음과 같은 variable들을 ctx map 이용할 있다. : _index, _type, _id, _version, _routing, _parent, _timestamp, _ttl

2015/05/20 13:07 2015/05/20 13:07
Trackback Address :: http://www.yongbi.net/trackback/730
[로그인][오픈아이디란?]
오픈아이디로만 댓글을 남길 수 있습니다
Name
Password
Homepage

Secret
< PREV |  1  |  ...  73  |  74  |  75  |  76  |  77  |  78  |  79  |  80  |  81  |  ...  566  |  NEXT >