엘라스틱서치, 데이터를 업데이트하는 다양한 방법
필드를 업데이트해야하는 경우가 있는데 업데이트 하는 방법엔 여러가지가 있다.
첫번째로 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로 업데이트했다.