Lined Notebook

데이터 모델링 (1) - Settings, Mappings

by HeshAlgo

엘라스틱서치에서는 색인할 때 문서의 데이터 유형에 따라 필드에 적절한 데이터 타입을 지정해야합니다.

이러한 과정을 매핑이라하고 색인될 문서의 데이터 모델링이라고도 할 수 있다.

즉, 인덱스에 추가되는 각 데이터 타입을 구체적으로 정의하는 일

 

한번 생성된 매핑의 타입은 변경할 수 없기 때문에 신중하게 선택해야 한다. 만약 타입을 변경하려면 인덱스를 삭제한 후 다시 생성하거나 매핑을 다시 정의해야한다. 

 

1. Settings

 

1) number_of_shards, number_of_replicas

모든 인덱스는 settings, mappings 라는 2가지의 정보 단위를 가지고 있습니다. 

// my_index의 settings, mappings 확인해보기

GET my_index

// my_index의 response

{
  "my_index" : {
    "aliases" : { },
    "mappings" : { },
    "settings" : {
      "index" : {
        "routing" : {
          "allocation" : {
            "include" : {
              "_tier_preference" : "data_content"
            }
          }
        },
        "number_of_shards" : "1",
        "provided_name" : "my_index",
        "creation_date" : "1642309101251",
        "number_of_replicas" : "1",
        "uuid" : "wdlTFkc6T1Onxdv90EFltg",
        "version" : {
          "created" : "7150299"
        }
      }
    }
  }
}

GET my_index를 통해서 settings와 mappings의 정보를 모두 확인해볼 수 있고 

GET (인덱스명)/_settings 및 GET (인덱스명)/_mappings를 통해 각각의 정보를 조회해볼수도 있습니다.

해당 settings의 정보에는 샤드의 수(number_of_shards) 및 복제본의 수(number_of_replicas)를 확인할 수 있습니다. 

elasticsearch의 7.0버전 이상부터는 디폴트 값이 1로 고정되었습니다.

 

인덱스를 생성할 때 샤드의 수와 복제본의 수를 아래와 같이 지정할 수 있습니다.

PUT my_index

{
  "settings": {
    "index": {          // 해당 index는 생략 가능

        "number_of_shards": 3,

        "number_of_replicas": 3

    }
  }
}

- number_of_shards : 해당 설정은 인덱스를 생성한 이후에 변경이 불가능하다. 샤드 수를 바꾸려면 인덱스를 재생성해야하고 기존 데이터의 인덱스를 재색인 해야 합니다. shrink API 또는 split API를 이용해서 샤드 수를 변경하는 것이 가능하긴 하지만 복잡한 과정들이 있어 거의 불가능하다고 생각하자.

- number_of_replicas : 해당 설정은 다이나믹하게 변경이 가능하다. 

PUT my_index/_settings

{
  "number_of_replicas": 2
  }
}

 

2) analyzer, tokenizer, filter

애널라이저, 토큰나이저, 필터도 settings에서 설정이 가능하다.

GET my_index

{

    "settings": {
        "analysis": {

            "analyzer": {
                "my_analyzer": {

                    "type": "custom",

                    "char_flter": [ "...", "..." ...],

                    "tokenizer": "...",

                    "filter": ["...", "...", ...]

                }

            },

            "char_filter": {

                "my_char_filter": {

                    "type": "..."

                    ...

                }

            },

            "tokenizer": {

                "my_tokenizer": {

                    "type": "..."

                     ...

                }

            },

            "filter": {

                "my_token_filter": {

                    "type": "..."

                    ...

                }

            }

        }
    }
}

"analysis": {} 내부에 analyzer, char_filter, tokenizer, filter를 입력하고 각자의 내부에서 임의의 이름을 주어 각 기능들을 정의한다.

각 내부에 하나 이상을 생성할 수도 있으며 애널라이저에서는 사용자가 정의한 tokenizer, filter를 사용하거나 Elasticsearch 안에 미리 정의되워 있는 것들의 사용이 가능합니다.

 

"analysis": {} 내용은 한번 생성 후 변경은 불가능합니다.

이외에 settings에 설정 가능한 정보가 공식문서에 정리가 되어있어서 필요하다고 생각되는 것들은 해당 포스트에 더 옮겨보겠습니다.

 

2. Mappings

Elasticsearch는 동적 매핑을 지원하기 때문에 미리 정의하지 않아도 인덱스에 Document를 새로 추가하면 자동으로 매핑이 생성됩니다. 인덱스가 없는 상태에서 다음의 Document를 인덱스에 입력하면 GET (인덱스명)/_mapping 시 매핑된 결과를 확인해볼수 있습니다.

PUT books/_doc/1

{

    "title": "Romeo and Juliet",
    "author": "William Shakepeare",

    "category": "Tragedies",

    "publish_date": "1562-12-01T00:00:00",

    "pages": 125
}

// books 인덱스의 매핑 확인

GET books/_mappings

 

// Response

{
    "books" : {
        "mappings" : {
            "properties" : {
                "category" : {
                    "type" : "text",
                    "fields" : {
                        "keyword" : {
                            "type" : "keyword",
                            "ignore_above" : 256
                        }
                }
        },
        "author" : {
            "type" : "text",
            "fields" : {
                "keyword" : {
                    "type" : "keyword",
                    "ignore_above" : 256
                }
            }
        },
        "pages" : {
            "type" : "long"
        },
        "publish_date" : {
            "type" : "date"
        },
        "title" : {
            "type" : "text",
            "fields" : {
                "keyword" : {
                    "type" : "keyword",
                    "ignore_above" : 256
                }
            }
        }
      }
    }
  }
}

인덱스의 매핑에서 필드들은 mappings 아래 properties 항목의 아래에 지정됩니다.

위에서 자동으로 매핑된 데이터 타입을 확인해보면

title -> text

author -> text

category -> text

pages -> long

publish_date -> date

위와 같이 자동으로 지정 된 것을 확인해볼 수 있습니다.

 

Elasticsearch의 매핑이 동적으로 생성 될 때는 필드의 값을 보고 타입을 예상하는데, 항상 그 필드가 포함될 수 있는 가장 넓은 범위 형태의 데이터 타입을 선택합니다. pages의 같은 경우 자연수를 저장하는 데이터 타입 중 가장 큰 long으로 지정이 됩니다. 

기본적으로 아래와 같이 매핑을 정의합니다.

GET my_index

{
    "mappings": {
        "properties": {

            "<필드명>": {

                "type": "<필드 타입>"

                ... <필드 설정>

            }

        }
    }
}

이미 만들어진 매핑에 필드를 추가하는것은 가능합니다. 하지만, 이미 만들어진 필드를 삭제하거나 필드의 타입 및 설정값을 변경하는 것은 불가능 합니다.

// 기존 매핑에 필드 추가

PUT <인덱스명>/_mapping

{
    "properties": {
        "<추가할 필드명>": {

            "type": "<필드 타입>"

            ... <필드 설정>

            }
    }
}

 

참고 문헌 😶

https://esbook.kimjmin.net/07-settings-and-mappings/7.2-mappings

 

7.2 매핑 - Mappings - Elastic 가이드북

인덱스의 매핑에서 필드들은 mappings 아래 properties 항목의 아래에 지정됩니다. 위 예제에서 보면 데이터 형식에 맞게 title, author, category 필드들은 text와 keyword타입으로, pages 필드는 long 타입으로, p

esbook.kimjmin.net

https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html

'Elasticsearch' 카테고리의 다른 글

[Elasticsearch] curl: (52) Empty reply from server  (0) 2022.10.02
검색과 쿼리 - Query DSL (2)  (0) 2022.05.28
Elasticsearch 데이터 처리  (0) 2022.02.24
Elasticsearch Node  (0) 2021.12.23
Elasticsearch에 대해서  (0) 2021.12.20

블로그의 정보

꾸준히 공부하는 개발 노트

HeshAlgo

활동하기