Elasticsearch

Elasticsearch Settings & Mappings

illho 2024. 4. 2. 22:01

모든 인덱스는 두 개의 정보 단위를 가지고 있는데 바로 settings(설정) 와 mappings(매핑) 이다.

인덱스를 처음 생성 한뒤 조회하면 설정과 매핑 정보를 확인할 수 있다.

 

설정 - Settings

 

 

 

 

GET user_info/_setings
GET user_info/_mappings

 

세팅이나 매핑 정보만 따로 보고 싶으면 위의 명령어로 보면 된다.

처음 인덱스를 정의하면 몇가지 정보들이 자동으로 생성되는데 샤드 수는 7.0버전부터 디폴트로 1개가 설정된다.

 

 

number_of_shards, number_of_replicas

 

샤드 수와 리플리카는 number_of_shards , number_of_replicas 에서 설정한다.

세팅 아래의 index 아래 설정에 명시되는데 index 레벨은 생략하고 입력 해도 정상적으로 입력 된다.

 

PUT user_info1
{
  "settings": {
    "index" : {
        "number_of_shards" : 3,
        "number_of_replicas" : 1
    }
  }
}

PUT user_info1
{
  "settings": {
        "index.number_of_shards" : 3,
        "index.number_of_replicas" : 1
  }
}

PUT user_info1
{
  "settings": {
        "number_of_shards" : 3,
        "number_of_replicas" : 1
  }
}

 

 

number_of_shards : 인덱스를 처음 생성할 때 한번 지정하면 바꿀 수 없다.

샤드 수를 바꾸려면 인덱스를 새로 정의하고 기존 인덱스의 데이터를 재색인 해야한다.

 

number_of_replicas 설정은 동적으로 변경 가능하다. 

PUT user_info1/_settings
{
  "number_of_replicas" : 3
}

 

 

refresh_interval

자주 사용되는 설정이다.

ES에서 세그먼트가 만들어지는 리프레시 타임을 설정하는 값인데 기본이 1초이다.

refresh_interval은 설정 변경이 가능하며 settings 의 index 아래에 설정한다.

 

PUT user_info1/_settings
{
  "refresh_interval": "30s"
}

 

 

analyzer , tokenizer , filter 

 

애널라이저, 토크나이저, 토큰 필터 역시 setting 내부에 정의한다.

 

PUT 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 를 입력하고 각자 내부에서 임의의 이름을 주어 각 기능들을 정의한다. 각 내부에 하나 이상 생성할수 있고 애널라이저에서는 사용자가 정의한 토크나이저, 토큰 필터를 사용하거나 ES 안에 미리 정의된 것을 사용 할 수 있다.

 

analysis 내용은 한번 생성한 후 변경은 불가능하다. 이미 만들어진 애널라이저나 토크나이저 등을 추가하거나 변경하려면 인덱스를 먼저 close 한 후에 추가하고 다시 open 해서 적용 해야 한다.

 

 

매핑 - Mappings

 

동적 매핑

 

Elasticsearch 는 동적 매핑을 지원하기 때문에 미리 정의하지 않아도 인덱스에 도큐먼트를 새로 추가하면 자동으로 매핑이 생성된다.

 

인덱스가 없는 상태에서 도큐먼트를 넣어본다.

PUT user_info2/_doc/1
{
  "name" : "user1",
  "age" : "22",
  "tel" : "010-1234-5678",
  "reg_date" : "2024-04-01T00:00:00"
}

 

user_info2 의 인덱스 매핑을 확인해보면 각 필드의 매핑이 자동으로 생성된 것을 확인할 수 있다.

 

 

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

name , age , tel 은 text와 keyword 타입으로, reg_date는 date 타입으로 자동 지정 된 것을 확인할 수 있다.

ES의 매핑이 동적으로 생성될 때는 필드의 값을 보고 타입을 예상하는데, 항상 그 필드가 포함 될 수 있는 가장 넓은 범위 형태의 데이터 타입을 선택한다.  reg_date 필드 값은 "2024-04-01T00:00:00" 로 ISO8601 표준 날짜 형식 데이터를 준수하였기 때문에 date 타입으로 인식 되었다. 날짜가 "4 April 2024 00:00:00" 과 같이 다른 포맷으로 입력이 되면 보통은 text 타입으로 인식된다.

 

매핑 정의

 

미리 인덱스의 매핑을 정의 해 놓으면 매핑에 맞추어 데이터가 입력된다.

PUT <인덱스명>
{
  "mappings": {
    "properties": {
      "<필드명>":{
        "type": "<필드 타입>"
        … <필드 설정>
      }
      …
    }
  }
}

 

이미 만들어진 매핑에 필드를 추가하는 것은 가능하다.

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

필드의 변경이 필요한 경우 인덱스를 새로 정의하고 기존 인덱스의 값을 새 인덱스에 모두 재색인 해야한다.

 

이미 생성된 인덱스에 새로운 필드를 추가하는 방법

PUT <인덱스명>/_mapping
{
  "properties": {
    "<추가할 필드명>": { 
      "type": "<필드 타입>"
      … <필드 설정>
    }
  }
}

 

 

reference

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