ES 특정 쿼리에 따른 update 처리하기

개발새발·2022년 6월 1일
0

elasticsearch

목록 보기
24/54

앞단에서 이제 찾았으니 데이터를 업데이트해야한다. 알고보니 나..이전에 해본적이 있어..?ㅋㅋㅋㅋ


서론🕵️‍♀️

이전에 사용했던 형태는 바로 아래와 같았다.

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 는 찾아보니 문서의 원본이라고 한다. 문서의 원본 중 변경할 필드명을 지정해주고 넣어줄 값을 지정해주면 끝! 👩‍🍳 참 쉽죵? ㅎ………………

profile
발새발개

0개의 댓글