IT/elasticsearch

Elasitcsearch 지정된 mapping 정보만 입력되도록 설정하는 방법

할일없는라이프 2023. 10. 10. 10:15

-사용목적

elasticsearch를 사용할때 mapping 정보를 입력해서 사용하곤 합니다. 이는 특정 필드를 특정 타입으로 저장하기 위한 일정의 정의 입니다. 그런데 es를 사용할때 위와 같은 maaping의 경우 지정된 필드명에 다른 타입이 들어가는 것은 맊을 수 있으나 지정되지 않은 다른 이름의 필드가 들어가는 것을 맊을수는 없습니다. 

시스템 로그를 수집하기 위해 사용하는 ES의 경우는 지정되지 않은 다른 값이 들어와도 상관 없으나(오히려 받아야됨) 무언가 시스템을 운영하는 목적의 es에는 다른 이름의 필드값이 들어가는 것은 좋은 상환은 아닙니다. 

"type_num" : {
	"type": "integer"
}

위와 같이 mapping 정보를 입력후에 다른 타입의 데이터를 넣으면 입력 에러가 발생하나, 
type_num1 등 다른 이름으로 데이터를 입력시에는 새로운 dynamic mapping 으로 추가가 됩니다. 

이런 상황을 방지하기 위해서는 dynamic mapping 기능 설정을 진행하면 됩니다. 

-사용방법

사용방법은 mapping 정보 입력간에 dynamic: strict를 선언하면 된다.
아래와 같이 선언후 필드 이름이 다른 값을 입력할경우 해당 필드의 이름은 허용되지 않았다라고 나오면서 다른이름의 필드값 입력이 되지 않는다 

PUT mapping_test
{
  "mappings": {
    "dynamic": "strict",
    "properties": {
      "number": {
        "type":"integer"
      }
    }
  }
}

잘못된 값입력

POST mapping_test/_doc/
{
  "namber": 1234
}

 라고 입력시  아래와 같은 에러가 발생하면서 입력이 안되는 것 을 확인할수 있습니다. 

{
  "error": {
    "root_cause": [
      {
        "type": "strict_dynamic_mapping_exception",
        "reason": "mapping set to strict, dynamic introduction of [ddd] within [_doc] is not allowed"
      }
    ],
    "type": "strict_dynamic_mapping_exception",
    "reason": "mapping set to strict, dynamic introduction of [ddd] within [_doc] is not allowed"
  },
  "status": 400
}

-사용예시

위의 방법은 솔루션 운영용 인덱스를 많들때 좋은 방식이다. 잘못된 데이터의 입력으로 예상치 못한 버그를 사전에 예방할 수 있습니다. 
그렇지만 이런 경우도 발생할수 있습니다.  

특정 필드의 하위에 넘버나 키를 넣은 오브젝트 타입을 넣어야 하는 경우는 위와같이 설정시 하위그룹에도 새로운 타입을 넣을수 없다는 문제가 발생한다 

PUT mapping_test
{
  "mappings": {
    "dynamic": "strict",
    "properties": {
      "type_list": {
        "type":"object"
      }
    }
  }
}

위와 같은 방식으로 오브젝트 타입을 등록 후 오브젝트 타입을 종류별로 다 mapping 정보를 입력해도 되나 
하위 타입에 대한 정의가 변경될수 있다면 좋은 방식응 아니다(ex , 1, 2,... 가, 나,....a,b)
현상태에서 하위 데이터 입력이 기존의 strict에 대한 에러가 발생한다. 

POST mapping_test/_doc/
{
  "type_list": {
    "1" : "신규사용자",
    "2": "기존사용자"
  }
}

이런경우에는 상단 mapping에는 stirict를 하단 "type_list" 에다가 dynamic : true를 설정하면서 해결할 수 있다.

PUT mapping_test
{
  "mappings": {
    "dynamic": "strict",
    "properties": {
      "type_list": {
        "dynamic": "true",
        "properties": {
          
        }
      }
    }
  }
}

위와 같이 설정후 다시 type_list 하단에 아무 데이터를 넣어도 해당 부분에 대해서만 dynamic mapping이 되는 것을 확인할 수 있습니다.