ETL/Elasticsearch

[Elasticsearch] 실무에서 자주 사용하는 쿼리(업데이트)

PONI 2023. 10. 17. 10:57
반응형

1. doc 업데이트

수정하고자 하는 doc을 지정하여 업데이트
doc의 특정 필드를 지정하여 업데이트 가능
1) 일반 필드
post emp/_update/1234
{
	"doc": {
    	"ath_cd": [
        	"R01",
            "R02"
        ],
        "ath_nm": "관리자,직원"
    }
}

2) nested 필드

post emp/_update/1234
{
	"doc": {
    	"nested_regi": [
        	{
            	"regi_yn": "Y",
                "regi_pooltypeid": "P02"
            }
        ]
    }
}

2. 조건대상 업데이트

-  script 절에서 변경 대상, 변경전 값, 변경후 값 입력

get emp/_search
{
	"script": {
    	"source": "for (int i = 0; i < ctx._source.nested_regi.size(); i++) { if (ctx._source.nested_regi[i].date_end_dt == '20231020') { ctx._source.nested_regi[i].date_end_dt == '20231031' } }"
    },
    "query": {
    	"bool": {
        	"must": [
            	{
                	"match": {
                    	"dvsn_cd": "123456"
                    },
                	{
                    	"nested": {
                        	"path": "nested_regi",
                            "query": {
                            	"bool": {
                                	"must": [
                                    	{
                                        	"match": {
                                            	"nested_regi.regi_yn": "Y"
                                            }
                                        },
                                        {
                                        	"terms": {
                                            	"nested_regi.regi_pooltypeid": [
                                                	"P01",
                                                    "P02"
                                                ]
                                            }
                                        }
                                    ],
                                    "must_not": [
                                    	{
                                        	"match": {
                                            	"nested_regi.date_str_dt": "99991231"
                                            }
                                        }
                                    ]
                                }
                            }
                        }
                    }
                ]
            }
        }
    }

 

3. 다중조건 업데이트

post emp/_update_by_query
{
	"script" {
    	"source": "for (item in ctx._source.nested_regi) {if (item.regi_yn == params.old_value && item.date_str_dt == params.target_value) {item.regi_yn = params.new_value}}",
        "params": {
        	"old_value": "N",
            "new_value": "Y",
            "target_value": "20231031"
        }
    },
    "query": {
    	"bool": {
        	"must": [
            	{
                	"match": {
                    	"emp_no": "1234"
                    }
                },
                {
                "nested": {
                	"path": "nested_regi",
                    "query": {
                    	"bool": {
                        	"must": [
                            	{
                                	"match": {
                                    	"nested_regi.regi_yn": "N"
                                    }
                                },
                                {
                                	"terms": {
                                    	"nested_regi.regi_pooltypeid": [
                                        	"P01",
                                            "P02"
                                        ]
                                    }
                                }
                            ]
                        }
                    }
                }
            ]
        }
    }
}

<개선사항은 언제든지 댓글로 부탁드립니다!>

반응형