도큐먼트 업데이트 방법
[도큐먼트 업데이트(필드 추가) 쿼리]
PUT /products/_update/100
{
"doc": {
"tages": ["electronics"]
}
}
사실 도큐먼트는 immutable(불변)하다. 위 쿼리는 실제로 도큐먼트 자체를 바꾼 것이 아니라 같은 ID의 도큐먼트를 필드가 추가한 것으로 바꿔치기 한 것으로 이해하면 된다. UPDATE API를 통해서 엘라스틱 서치는 이를 내부 구현으로 제공하는데, 만약 사용자가 직접 이를 구현하고자 한다면 삭제 요청과 생성 요청, 두 개를 보내야 하기 때문에 네트워크 지연과 부하를 줄 수 있다.
[scripted updates]
필드를 업데이트할 때, 기존 값을 모른다면 scripted updates 방식을 취할 수 있다. 예를 들어 제품의 현 재고 수량을 모르지만, 하나가 판매되어 수량을 줄여야 할 때 유용하다. 아래는 사용 예시이다.
POST /products/_update/100
{
"script": {
"sources": "ctx._source.in_stock--"
}
}
// in_stock 값을 10으로 업데이트
POST /products/_update/100
{
"script": {
"sources": "ctx._source.in_stock = 10"
}
}
// 파라미터를 이용하여 값을 업데이트
POST /products/_update/100
{
"script": {
"sources": "ctx._source.in_stock -= params.quantity",
"params" : {
"quantity": 4
}
}
}
// if와 noop을 이용한 업데이트 - If문으로 인해서 noop 이 실행되면 result key 역시도 noop으로 노출된다.
// delete 명령어도 사용이 가능하다. result 가 어떤지 알기 위해서는 이러한 명령어 방법을 쓰는 것이 좋다.
POST /products/_update/100
{
"script": {
"source":
"""
if (ctx._source.in_stock == 0) {
ctx.op = 'noop';
}
ctx._source.in_stock--
"""
}
}
*ctx : context
**_source : 도큐먼트의 필드에 있는 객체를 의미
***in_stock-- : in_stock 필드에서 1 빼기
[upsert query]
// update 가 실행되면 result :updated, insert가 실행되면 result: created가 응답으로 온다.
POST /products/_update/101
{
"script": {
"sources": "ctx._source.in_stock++"
},
"upsert": {
"name": "Blender",
"price" : 399,
"in_stock": 5
}
}
[도큐먼트 교체하기]
PUT /products/_doc/100
{
"name": "Toaster",
"price": 49,
"in_stock": 4
}
이렇게 하면 앞서 tags 필드를 추가했던 id = 100인 도큐먼트가 replace 되면서 tags 필드가 사라진 새 도큐먼트가 저장되게 된다.
[Delete query]
DELETE /products/_doc/101
'TIL > 엘라스틱 서치' 카테고리의 다른 글
Elastic Search : Complete Guide to ElasticSearch - 낙관적 동시성 제어 (0) | 2024.01.14 |
---|---|
Elastic Search : Complete Guide to ElasticSearch - 도큐먼트 라우팅 (0) | 2024.01.08 |
Elastic Search : Complete Guide to ElasticSearch - 클러스터링과 샤딩 (1) | 2024.01.04 |
Elastic Search : 엘라스틱 스택 개발부터 운영까지 - 2 (1) | 2024.01.03 |
Elastic Search : 엘라스틱 스택 개발부터 운영까지 - 1 (1) | 2024.01.03 |
댓글