앞단에서 이제 찾았으니 데이터를 업데이트해야한다. 알고보니 나..이전에 해본적이 있어..?ㅋㅋㅋㅋ
이전에 사용했던 형태는 바로 아래와 같았다.
POST {index명}/_update/{_id}
{
"doc": {
"{변경할 field명}": {변경할 field의 값}
}
}
이 경우에는 데이터의 고유값(RDBMS의 pk값이라 할 수 있다)인 _id
를 사용해야했다. 그런데, 우리는 ES SQL 를 사용하여 특정값을 뽑아내서 그 값으로 조회를 하여 업데이트를 할 예정이였다. _id
는… 그런데 ES SQL 조회시 같이 리턴해주지 않았다…ㅎ.. ㅠ 시스템에서 부여해주는 값이여서 그렇다나뭐라나… 매핑을 뭐 다시 해줘야된다고도 본 것 같다. 이미 ES에 데이터가 너무 많고 이것때문에 매핑을 다시 하는 것도 웃겨서 고민하고 있었다.
그.런.데. 회사동료분이 ES Update_by_query 를 발견하심!!! 바로 https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update-by-query.html 이것이다❗
POST {인덱스명}/_update_by_query
'script' => [
'source' => 'ctx._source.{변경할 필드명} = {변경할 필드값}',
],
'query' => [
'bool' => [
'filter' => [
'terms' => [
'{조건 필드명}' => {조건 필드값}
]
]
]
]
query
문은 알다싶이 변경해도 무관하다. 해당 쿼리문 조건에 맞는 값들을 찾아와서 script
를 실행해주는데, source
는 ES가 문서를 리턴해줄 때 실제 데이터를 넣어주는 곳이다. ctx._source
는 찾아보니 문서의 원본이라고 한다. 문서의 원본 중 변경할 필드명을 지정해주고 넣어줄 값을 지정해주면 끝! 👩🍳 참 쉽죵? ㅎ………………