ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ElasticSearch - 매핑(mapping)
    ElasticSearch 2024. 9. 22. 22:08
    반응형

    매핑

    문서의 구조를 나타내는 정보
    ElasticSearch는 스키마리스가 아니라 미리 정의하지 않아도 될 뿐이다.

     

    종류 정의
    독적 매핑(Dynamic Mapping) 처음 색인되는 문서를 바탕으로 매핑 정보를 ElasticSearch가 동적으로 생성
    정적 매핑(Static Mapping) 문서의 매핑 정보를 미리 정의 

     

    동적 매핑

    어떤 문서가 색인될지 스키마를 미리 정의 하지 않아도 된다. 

    {
      "type": "book",
      "title": "elasticsearch essential",
      "author": "alden",
      "rating": 5.0
    }

     

    위와같은 문서를 색인한다고 가정해보겠다. 4가지의 필드들이 존재한다. 

     

    GET /library/_mapping
    {
      "library": {
        "mappings": {
          "author": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "rating": {
            "type": "float"
          }
        }
      }
    }

     

    author의 경우 문자열이기 때문에  text로 되어있으며, rating의 경우는 float타입으로 설정이 되어있다.

    맨처음 색인되는 문서를 보고 동적으로 매핑을 생성하게된다.

     

    동적 매핑에 의해 매핑 정보가 생성된 후에는 타입이 안 맞을 경우 파싱 에러가 발생한다.

    동적매핑 뿐 아니라 매핑 후에 타입이 맞지 않는 경우 파싱에러가 발생한다. 

     

    {
      "type": "book",
      "title": "linux kernel",
      "author": "alden",
      "rating": "4.0"
    }

    이와같이 rating필드에 "4.0"으로 색인을 한다면

    {
      "error": {
        "root_cause": [
          {
            "type": "mapper_parsing_exception",
            "reason": "failed to parse"
          }
        ],
        "type": "mapper_parsing_exception",
        "reason": "failed to parse",
        "caused_by": {
          "type": "not_x_content_exception",
          "reason": "Compressor detection ..."
        }
      },
      "status": 400
    }

    이와같이 파싱에러가 발생하게 된다. 

    처음에 색인된 문서에 의해 floating으로 색인이 되었지만 "4.0"과같이 text형식이 들어온다면 파싱에러가 발생하게 된다. 

     


    정적 매핑

    어떤 문서가 색인될지 스키마를 미리 정의한다.

    PUT /library
    {
      "mappings": {
        "properties": {
          "title": {
            "type": "text"
          },
          "rating": {
            "type": "double"
          }
        }
      }
    }

     동적 매핑과 다르게 인덱스를 생성할때 매핑정보를 미리 넣어준다.

    title의 경우는 text, rating의 경우에는 double형식으로 지정해준다.

     

    {
      "type": "book",
      "title": "elasticsearch essential",
      "author": "alden",
      "rating": 5.0
    }

     

    여기서 지정하지 않은 type과 author의 경우는 동적매핑으로 실행이 된다.

    반드시 타입 지정이 필요한 경우에만 정적 매핑으로 지정해주면 된다.


     

    정적 매핑이 도움이 되는 경우

     

    1. 정확한 데이터 타입 관리가 필요한 경우
      • 데이터 필드가 고정된 형식이어야 하는 경우 정적 매핑은 매우 유용합니다. 예를 들어, rating 필드는 항상 float 또는 double이어야 한다고 가정할 때, 정적 매핑을 통해 이 필드가 항상 올바른 타입으로 저장되도록 강제할 수 있습니다. 잘못된 타입(예: 문자열)이 들어오면 오류가 발생하기 때문에 데이터 일관성을 보장할 수 있습니다.
      예시: 수치 데이터를 다루는 경우, 잘못된 타입(예: 숫자 대신 문자열)으로 저장되는 것을 방지하고 싶다면, 미리 해당 필드를 integer, float, double 등으로 정의하여 저장 오류를 예방할 수 있습니다.
    2. 성능 최적화
      • 미리 매핑을 정의하면 Elasticsearch가 데이터를 저장할 때 필드 타입을 자동으로 추론할 필요가 없기 때문에, 성능 면에서 이점이 있습니다. 데이터가 많을 경우 자동으로 매핑하는 과정에서 오버헤드가 발생할 수 있기 때문에, 정적 매핑을 사용하면 불필요한 매핑 추론 작업을 피할 수 있습니다.
      예시: 큰 규모의 로그 데이터나 메타 데이터를 저장할 때, 미리 매핑을 정의해 두면 대량의 데이터가 빠르게 삽입될 수 있습니다.
    3. 매핑 변화로 인한 오류 방지
      • 자동 매핑(dynamic mapping)을 사용할 경우, Elasticsearch가 데이터를 처음으로 인덱싱할 때 필드 타입을 자동으로 결정합니다. 하지만 같은 필드에 대해 다른 데이터 타입이 들어올 경우 매핑 충돌(mapping conflict)이 발생할 수 있습니다. 정적 매핑은 이를 미연에 방지할 수 있습니다.
      예시: user_id 필드가 처음에는 숫자로 저장되었는데, 나중에 문자열로 저장을 시도하면 충돌이 발생할 수 있습니다. 이때 정적 매핑을 사용하면 처음부터 user_id가 숫자로 저장되도록 강제하여 오류를 방지할 수 있습니다.
    4. 복잡한 데이터 구조 처리
      • 복잡한 데이터 구조를 다룰 때, 특히 다중 필드(multi-fields), 중첩 필드(nested fields), 또는 객체(object)와 같은 복잡한 구조를 미리 정의하는 것이 필요할 수 있습니다. 이러한 구조는 자동 매핑보다는 정적 매핑을 통해 명시적으로 설정하는 것이 더 안전합니다.
      예시: address 필드가 객체로서 city, state, zipcode 같은 하위 필드를 가질 때, 이를 정적으로 미리 정의하면 데이터가 올바르게 구조화되어 저장됩니다.
    5. 특정 분석기가 필요한 경우
      • 필드에 대해 특별한 분석기(analyzer)나 필터(token filter)를 적용하고자 할 때, 정적 매핑이 필요합니다. 자동 매핑으로는 Elasticsearch가 기본 분석기를 사용하기 때문에, 예를 들어 특정 언어 처리나 사용자 정의 분석기를 적용하려면 정적 매핑을 통해 필드를 명시적으로 정의해야 합니다.
      예시: 텍스트 필드에 대해 특정 언어(예: 한국어, 일본어 등)에 맞는 분석기를 사용하려는 경우, 미리 매핑에서 분석기를 정의해야 올바른 처리가 가능합니다.

    정적 매핑의 예시

    PUT /library
    {
      "mappings": {
        "properties": {
          "title": {
            "type": "text",
            "analyzer": "standard"
          },
          "author": {
            "type": "keyword"
          },
          "published_date": {
            "type": "date",
            "format": "yyyy-MM-dd"
          },
          "rating": {
            "type": "double"
          }
        }
      }
    }

    이 예시에서:

    • title 필드는 text 타입으로 정의되고, 기본 standard 분석기를 사용하도록 설정되었습니다.
    • author 필드는 keyword 타입으로 설정되어 정확한 일치 검색에 사용됩니다.
    • published_date 필드는 date 타입으로 지정되며, "yyyy-MM-dd" 형식을 따릅니다.
    • rating 필드는 double 타입으로 설정되어 숫자형 데이터를 저장할 수 있도록 합니다.

    결론

    정적 매핑은 다음과 같은 경우에 도움이 됩니다:

    • 데이터 일관성을 유지하고 잘못된 데이터 입력을 방지할 때
    • 성능을 최적화하고 매핑 추론 과정을 줄일 때
    • 매핑 충돌을 방지하고, 특정 데이터 구조를 강제할 때
    • 복잡한 필드 분석 및 구조화를 필요로 할 때
    반응형

    댓글

Designed by Tistory.