반응형

엘라스틱서치의 필드 데이터 타입인 Object과 Nested을 알아보고, 유사한 두 타입의 차이점을 살펴보자. 인덱스 생성 시 매핑 설정을 정확히 하기 위해서는 필드 타입을 잘 이해하는 것이 중요하다.

책 엘라스틱서치 실무 가이드와 엘라스틱서치 공식가이드북를 바탕으로 정리한 포스팅입니다. 내용에 오류가 있다면 댓글로 알려주시면 감사하겠습니다 :)

공식 가이드북 : 7.2.5 Object와 Nested

Object 데이터 타입

JSON 포맷의 object, 즉 객체 타입의 값을 사용할 수 있다. 내부 객체를 계층적으로 포함하고 있는 경우 object 타입 형태로 사용한다. object 타입 정의를 위해 특정 키워드를 사용하지 않고 문서 구조를 입력하면 된다.

Object 타입을 이해하기 위해 아래 예제를 따라가보자.

  • 인덱스 생성

    PUT 코로나확진자동선/_mapping
      {
        "properties": {
          "이름": {
            "type": "text"
          },
          "이동경로": {
            "proferties": {
              "행정동": {
                "type": "text"
              },
              "방문지": {
                "type": "text"
              },
              "방문일시": {
                "type": "date",
                "format": "yyyy-MM-dd HH:mm:ss"
              }
          }
        }
      }

참고로 인덱스명과 필드명은 영어 소문자여야 한다. 편하게 이해하기 위해 한글명을 사용하였다.

 

  • 샘플 데이터 등록

    PUT 코로나확진자동선/_doc/1
    {
      "이름": "김꾸러기",
      "이동경로": [
        {
          "행정동" : "신도림동",
          "방문지" : "김밥랜드 신도림점",
          "방문일시" : "2020-04-07 19:30:00"
        },
        {
          "행정동" : "화곡동",
          "방문지" : "해피마트 까치산점",
          "방문일시" : "2020-04-11 21:30:00"
        }
      ]
    }

     

  • 데이터 검색

    1. 첫번째 검색

      • 검색조건 : 행정동:"신도림동", 방문일시:"2020-04-07 ~"
      • 검색결과 : 문서ID 1인 "김꾸러기" 가 조회됨
    2. 두번째 검색

      • 검색조건 : 행정동:"신도림동", 방문일시가 "2020-04-11 ~"
      • 검색결과 : 문서ID 1인 "김꾸러기" 가 조회됨

      "김꾸러기"는 "2020-04-11 ~"에 "신도림동"에 가지 않았다. 하지만 Object 내부 연산은 OR 연산으로 이루어지기 때문에 검색 결과로 노출이 되었다.

    이러한 이슈를 해결하기 위해 Nested 데이터 타입이 고안되었다.

 

Nested 데이터 타입

Nested 데이터 타입은 Object 객체 배열을 독립적으로 색인하고 질의하는 형태의 데이터 타입이다.

이를 사용하면 중첩된 필드를 검색할 때 정확히 일치하는 문서만 출력 가능함

  • 위 예제의 인덱스의 필드가 Nested 타입으로 매핑되었다고 가정하고 데이터를 검색해보자.
    1. 첫번째 검색
      • 검색조건 : 행정동:"신도림동", 방문일시:"2020-04-07 ~"
      • 검색결과 : 문서ID 1인 "김꾸러기" 가 조회됨
    2. 두번째 검색
      • 검색조건 : 행정동:"신도림동", 방문일시가 "2020-04-11 ~"
      • 검색결과 : 조회되지 않음

nested 쿼리로 검색하면 nexted 필드의 내부에 있는 값들을 모두 별개의 문서로 취급한다. nested 필드 내 하위 문서는 내부적으로 별도의 도큐먼트로 분리되기 때문에 쿼리 결과에서 상위 도큐먼트와 합쳐져서 보이게 된다. 의도했던 대로 정확히 일치하는 문서만 도출할 수 있게 된 것이다.

참고 : Nested 필드는 nested 쿼리를 사용해야한다.

반응형