IT/elasticsearch

[ElasticSearch] 인덱스 mapping / dynamic strict

할일없는라이프 2023. 8. 21. 23:16

ElasticSearch의 인덱스 는 기존의 RDB처럼 스키마를 생성할 필요가 없습니다. 
이는 기존에 존재하지 않는 인덱스에 Create API 만 호출하면 해당 인덱스가 생성되며, 들어온 정보로 Dynamic 매핑정보를 생성합니다. 
이번 블로그에서는 인덱스 필드 속성 즉 mapping에 대해 알아보겠습니다. 

Dynamic mapping 

사용자가 전달한 정보로 ElasticSearch에서 알아서 인덱스의 mapping 정보를 생성합니다. 
사용자가 전달한 정보가 스트링이라면 text/keyword ,  정수숫자라면 long, 논리값이라면 boolean, 날짜라면 data이런식으로 매핑이 자동으로 생성됩니다.  

이런식의 Dynamic 매핑 덕분에 최초의 데이터를 쉽게 넣어서 매핑 정보를 확인 하거나 할때 유용하게 사용됩니다. 
하지만 Dynamic매핑도 데이터의 정의를 사용하가 한것이 아니기 때문에 간혹 사용자의 의도와 다른 mapping이 되면서 문제가 발생하게 됩니다. 

ex) 최초 index된  number 필드가 정수였으나 이후 실수형 데이터가 들어온다면 인덱싱이 불가능하다 

그렇기 때문에 Elasticsearch의 index의 필드들을 사전에 정의할 필요하있습니다.  이런 과정을 명시적 매핑 explicit mapping 이라고합니다. 

Explicit mapping

index에 데이터가 들어오기전 혹은 최초 받은 정보를 기반으로 필드들의 속성을 미리 정의하는 과정입니다. 사용방법은 간단합니다. 

PUT test_mapping
{
  "mappings": {
    "properties": {
      "number": {
        "type": "long"
      },
      "text": {
        "type": "text"
      },
      "bool": {
        "type": "boolean"
      }
    }
  }
}

사용자가 생각하는 index의 모양으로 위와 같은 식으로 생성할수 있습니다.
이후 Index api로 데이터를 추가한다면 해당필드들의 해당 유형의 데이터만 indexing이 가능합니다. 

하지만 이런식의 매핑을 넣더라도 필드의 이름을 다르게(number를 number2) 넣는다면 다시 Dynamic매핑으로 데이터가 기록됩니다. 
이런경우에는 dynamic 옵션을 넣어서 우리가 정의한 필드와 다른이름의 필드가 들오온다면 Error를 하도록 설정이 가능합니다. 

PUT test_mapping
{
  "mappings": {
    "dynamic":"strict",
    "properties": {
      "number": {
        "type": "long"
      },
      "text": {
        "type": "text"
      },
      "bool": {
        "type": "boolean"
      }
    }
  }
}

 

위에 API에서 "dynamic" : "strict" 를 추하하면 우리가 정의한 필드외에 다른 필드가 추가되는 것을 막을수 있습니다. 

dynamic: strict 적용