반응형

필드를 업데이트해야하는 경우가 있는데 업데이트 하는 방법엔 여러가지가 있다. 

 

첫번째로 POST를 아예 전체 다시 쓰는 경우다.

 

이게 뭔말이냐 하면 POST로 처음에 인덱스에 값을 등록하는 것처럼 똑같은 데이터를 즉 아이디가 같은 데이터를 똑같이 POST로 입력해주면 업데이트가 된다. 처음에 데이터 등록할때처럼 해도 된다는 거다.

 

두번째로 _UPDATE문을 이용하는거다. 이 경우는 전체가 아니라 일부만 컬럼만 수정이 가능하다.

 

POST test/_update/test_1826
{
  "doc": {
    "point": 6
  }
}

 

이렇게 /index명/_update/아이디 를 써주고 원하는 필드에 값을 넣어주면 전체가 아닌 일부 컬럼만 업데이트가 된다.

 

이번엔 update문에 script를 사용해보자. 

 

POST test/_update/test_1826
{
  "script": {
    "source": "ctx._source.point = params.point",
    "lang": "painless", 
    "params": {
      "point": 100
    }
  }
}

 

script부분을 설명하면 

 

우선 엘라스틱서치는 "painless"라는 script언어를 사용한다.

"source"에 있는 거는 point라는 필드 값을 params라는 json데이터 안에 있는 point값을 가져와서 넣겠다는 뜻이다.

 

그래서 point가 100이된다.

 

위의 쿼리는 아래와 같이 쓸 수 있다.

 

POST test/_update/test_1826
{
  "script" : "ctx._source.point = 200"
}

 

이렇게 하면 point가 200이 된다. 이렇게 직접 넣을 수도 있다.

 

스크립트를 이용하면 if문을 쓸 수도 있다.

 

POST test/_update/test_1826
{
  "script": {
    "source": "if (ctx._source.name.equals('test')) { ctx._source.point = 1000 }"
  }
}

 

name이 test인 놈을 찾아서 point에 1000을 입력할 수 있다.

 

세번째는 _update_by_query 다

 

POST cboard/_update_by_query
{
  "script": {
    "source": "ctx._source.name = 'elas'",
    "lang": "painless"
  }, 
  "query": {
    "match" : {
      "point" : 1000
    }
  }
}

 

point가 1000인 게시물의 name을 elas로 업데이트했다.

반응형

+ Recent posts