ElasticSearch

[ElasticSearch] _update_by_query (update by query)

SongMinu 2019. 7. 22. 14:25
728x90

특정 쿼리에 해당하는 데이터들을 한번에 update 하는 쿼리

index_name/_update_by_query [POST]

{
    "script":{
        "source":"ctx._source.USER_LOCATION = params.location",
        "params":{
            "location":"경기도"
        }
    },
    "query":{
        "term":{
            "USER_LOCATION":"서울특별시"
        }
    }
}

index_name에 있는 document 들 중에 USER_LOCATION 값이 서울특별시 인 데이터들을 경기도로 변경

 

 

주의할점!!!

update 시킬 데이터가 지나치게 많을 경우 처리하는 개수를 정할 수 있는지 모르겠는데

일정량씩 처리를 해서 오래 걸릴 수 있으니 생각하고 사용해야함

 

전에 데이터 몇만개 짜리를 _update_by_query를 cerebro에서 날렸는데 cerebro가 먹통이 되면서 엘라스틱서치도 멈춘건가 했는데

일정량씩 처리되고 있었음..

 

여러개 쓸 때는 ,(콤마)가 아닌 ;(세미콜론으로 구분지어야함)

index_name/_update_by_query [POST]

{
    "script":{
        "source":"ctx._source.USER_LOCATION = params.location;ctx._source.ETC = params.etc",
        "params":{
            "location":"경기도",
            "etc": "test"
        }
    },
    "query":{
        "term":{
            "USER_LOCATION":"서울특별시"
        }
    }
}

이런식으로 할 수도 있고

또 추가적으로 params가 아닌 방법으로는 다음과 같은 방법이 있음

index_name/_update_by_query [POST]

{
    "script":{
        "source":"ctx._source.USER_LOCATION = '경기도'"
    },
    "query":{
        "term":{
            "USER_LOCATION":"서울특별시"
        }
    }
}

문자열은 '를 이용해 감싸주면 되고

정수는 '없이 숫자를 입력하면됨

 

그리고 가능하면 그냥 바로 _update_by_query를 날리지말고 먼저 쿼리로 바꾸고자 하는 데이터가 맞는지 검색을 한뒤 하는게 좋다.

바로 위 소스로 예시를 든다면

index_name/_search [GET]

{
    "query":{
        "term":{
            "USER_LOCATION":"서울특별시"
        }
    }
}

이렇게 먼저 바꾸려는 데이터가 출력이 되는지 확인을 한 후 맞다면

index_name/_update_by_query [POST]

{
    "script":{
        "source":"ctx._source.USER_LOCATION = '경기도'"
    },
    "query":{
        "term":{
            "USER_LOCATION":"서울특별시"
        }
    }
}

이렇게 하면 된다.

 

반응형