[ElasticSearch] 조금 더 복잡한 CRUD - nested, delete-by-query

조갱·2022년 10월 10일
0

ElasticSearch

목록 보기
2/7

이전 포스팅 에서 간단하게 모델을 만들고, CRUD 를 테스트했다.
이번 포스팅에서는 조금 더 복잡한 CRUD를 해보기로 한다.

Nested 필드에 대한 자세한 설명은 [이곳을 클릭]하여 확인해보자.

Nested 필드에서 Select 하기

이전 포스팅에서는 Person 의 age로 검색을 했다.
그렇다면, nested 필드인 address에서 검색을 해보자.

MySQL

SELECT *
FROM Person p, Address a
WHERE p.personId = a.personId
AND a.country = 'KR'

==

SELECT *
FROM Person p
INNER JOIN Address a ON p.personId = a.personId
WHERE a.country = 'KR'

ES

ES에서는 아래와 같이 하면 될거같지만..

GET person/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {"address.country": "KR"}
        }
      ]
    }
  }
}


아무것도 안나온다. nested 안에 있는 데이터를 조회하기 위해서는 nested키워드를 사용해야한다. 아래 쿼리로 다시 검색해보자.

GET person/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "nested": {
            "path": "address",
            "query": {
              "bool": {
                "filter": [
                  {
                    "term": {"address.country": "KR"}
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}


이번엔 데이터가 제대로 나온다.

조건으로 삭제하기 - Delete-by-query

이전 포스팅에서는 doc_id 를 입력해야만 document를 삭제할 수 있었다.
그러나 조건에 따라 삭제하고싶은 경우가 있다. (MySQL 에서 where문)
이러한 경우는 스크립트로 해결이 가능하다.

MySQL

DELETE
FROM Person
WHERE age = 27

ES

document 내에 일반적인 필드로 조회하기

POST /person/_delete_by_query
{
  "query": {
    "match": {
      "age": 27
    }
  }
}

document 내에 nested 필드에서 조회하기

조금 응용해서 nested 안에 있는 데이터로 검색해서 삭제하려면

POST /person/_delete_by_query
{
  "query": {
    "bool": {
      "filter": [
        {
          "nested": {
            "path": "address",
            "query": {
              "bool": {
                "filter": [
                  {"term": {"address.country": "KR"}}
                ]
              }
            }
          }
        }
      ]
    }
  }
}


와 같이 작성할 수도 있다.

script 로 삭제하기

  • Script로 nested 필드 안에 있는 데이터를 조회해서 삭제하는 기능은 아직 모르겠다..
    실무에서 쓸 일이 없었다.
  • 그래서 nested가 아닌 일반적인 필드를 스크립트로 조회하여 삭제하는 방법에 대해서만 소개한다.
POST /person/_delete_by_query
{
	"query":{
		"bool":{
			"filter":{
				"script":{
					"script": "doc['age'].value == 27"
				}
			}
		}
	}
}
profile
A fast learner.

0개의 댓글