ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Elasticsearch] Mapping시 유의사항(dynamic mapping, _all field, text, keyword)
    Elasticsearch 2020. 8. 11. 20:52

    한 번 설정된 mapping의 type은 변경할 수 없음!

    (예를 들어, text→keyword 변경 불가)

     

    다음의 내용을 충분히 고려해야함

    • 문자열을 전문 검색에 이용할 것인가
    • 날짜 필드를 가지는 필드는 무엇인가
    • 매핑에 정의되지 않고 유입되는 필드는 어떻게 처리할 것인가

     

    1. dynamic mapping 사용 자제

     - ES는 기본적으로 schemaless이기 때문에, 매핑 정보가 없어도 알아서 적절한 매핑을 생성해줌

     - 자동으로 생성된 매핑 이후, 다른 타입의 데이터가 들어온다면 색인되지 않음

     - dynamic mapping 기능을 명시적으로 해제해 주어야 함 

    PUT /account_log

    {

      "settings": {

        "number_of_shards": 5,

        "number_of_replicas": 1

      },

      "mappings": {

        "_doc":{

          "_all": {"enabled": false},

          "dynamic" : "strict", // Dynamic Mapping 기능 해제

          "properties": {

            "timestamp": {"type" : "date",

              "format" : "yyyy-MM-dd HH:mm:ss"

            },

            "level": {"type" : "keyword"},

            "message": {"type" : "text"},

            "service": {"type" : "keyword"},

            "hostname": {"type" : "keyword"},

            "remote_ip": {"type" : "keyword"},

            "rule_id" : {"type" : "long"} 

          }

        }

      }

    }

     

     

    2. 전문 검색(Full Search) 대상이 아닌 문자열 필드는 keyword type 명시적으로 지정

     - text type으로 지정할 경우, 전문 검색이 가능한 필드로 지정되어 형태소 단위로 분석(Analyze)해 역색인(Inverted Index) 구조로 저장하기 때문에 검색과 저장에 소모되는 비용이 커짐

     - dynamic mapping 사용 시, 문자열 필드의 경우 text type, keyword type의 2가지 타입을 동시에 가지는 멀티 타입 필드로 생성됨.

     

    3. _all field 사용 자제

     - 필드 이름을 지정하지 않고 검색할 때 사용되는 필드

     - 도큐먼트의 모든 필드의 value를 하나로 합쳐서 가지고 있는 필드

     - _all field는 text type으로 간주되어 색인 시 analyze 대상이 되므로 색인 속도가 느려짐

     - 세그먼트에 저장되지는 않지만 힙 영역에 올라가는 데이터

     - 6.0부터 deprecated (가급적 안쓰는게 좋음)

     - _all field를 5버전 이하에서 사용한다면 disable 권고

    PUT /account_log

    {

      "settings": {

        "number_of_shards": 5,

        "number_of_replicas": 1

      },

      "mappings": {

        "_doc":{

          "_all": {"enabled": false}, // all field 사용 해제

          "dynamic" : "strict",

          "properties": {

            "timestamp": {"type" : "date",

              "format" : "yyyy-MM-dd HH:mm:ss"

            },

            "level": {"type" : "keyword"},

            "message": {"type" : "text"},

            "service": {"type" : "keyword"},

            "hostname": {"type" : "keyword"},

            "remote_ip": {"type" : "keyword"},

            "rule_id" : {"type" : "long"} 

          }

        }

      }

    }

     

    댓글

Designed by Tistory.