[ElasticSearch] Nested와 Object 차이, 데이터 저장 원리

조갱·2022년 10월 15일
0

ElasticSearch

목록 보기
3/7
post-thumbnail

json 의 구조

json 필드의 데이터로 객체(object)를 넣을 때,
{}(중괄호) 또는 배열 [](대괄호)을 넣을 수 있다.

ES의 document도 json 구조라서 객체를 담을 수 있는데,
ObjectNested 두 가지 방식이 있어서 각각에 대한 설명과 공통/차이점을 기술한다.

데이터 모델은 [ElasticSearch] 데이터 CRUD 하기 - With MySQL 에 있는 아래 사진을 사용한다.

김부자 (남, 27세) 는 도지나락으로 코인부자가 되어 집을 2채 산 다주택자이다.
그래서 그는 주소를 2개 등록했다. 이를 json으로 표현하자면 아래와 같다.

{
  "personId": 1,
  "name": "김부자",
  "gender": "M",
  "age": 27,
  "address": [
    {
      "personId": 1,
      "country": "KR",
      "city": "SEOUL"
    },
    {
      "personId": 1,
      "country": "US",
      "city": "LOS ANGELES"
    }
  ]
}

Object

object 는 document를 하나로 저장한다.
사진으로 표현하자면

이렇게가 하나의 document로 저장되는 셈이다.

공무원 '김공무' 는 '김부자'가 탈세했는지 여부를 조회하기 위해 아래와 같은 쿼리를 날렸다.

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

참고로, 위 쿼리는 KR 에서 LOS ANGELES 를 검색하는 잘못된 쿼리이다.
(LOS ANGELES 는 US에 있다.)
그러나, 위 쿼리에서 '김부자'가 검색됐다.

왜?

ES 의 reverse Index 관점에서 풀어보면, 아래와 같다.

데이터 저장 관점에서 보면 아래와 같다.

{
  "personId": 1,
  "name": "김부자",
  "gender": "M",
  "age": 27,
  "address.personId": [1, 1],
  "address.country": ["KR", "US"],
  "address.city": ["SEOUL", "LOS ANGELES"]
}

KR -> 1번 doc
LOS ANGELES -> 1번 doc
최종 결과 : 1번 doc
그래서 잘못된 조건임에도 검색이 된 것이다.

Nested

nested 는 nested 필드 안에 있는 document가 각각 저장되며,
parent document에 합쳐진다.
사진으로 표현하자면

이렇게 3개의 document (초록색 2개는 꽁꽁 숨겨져있다.) 가 저장된다.

'김공무'는 다시 한번 쿼리를 날려본다. (이번엔 nested 쿼리로 날렸다.)
하지만 이번엔 검색되지 않는다.

왜?

다시 한 번 reverse Index 관점에서 보자.

KR -> HIDE_DOC (2)
LOS ANGELES -> HIDE_DOC(3)
공통된 document가 없기 때문에, 검색되지 않았다.

공통점

  • 다른 데이터 구조나 배열 등 객체를 넣을 수 있다.
  • 검색할 때, 계층 구조를 . 으로 구분한다. (address.city)

차이점

  • 데이터 저장 방식이 다르다.
  • nested 필드에서 조회하기 위해서는 nested 키워드를 써야한다.
  • nested 는 별도로 도큐먼트를 저장하기 때문에 좀 더 많은 메모리와 리소스를 사용한다.
profile
A fast learner.

0개의 댓글