본문 바로가기

ELK

[ES] mapping 데이터 타입 설정하기

ES는 인덱스를 자동생성된 방식 그대로 사용하기를 권장하지 않는다. 키바나를 올바르게 활용하기 위해서는 템플릿을 통해 인덱스의 데이터 타입 가공이 필요하다. 


가령 키바나에서 1초 이상의 요청시간이 필요한 로그(time:>1000)를 검색하고 싶다면 해당 데이터의 타입은 string이 아닌 integer여야한다.

자동생성되는 매핑타입은 일반적으로 string keyword 이므로, 템플릿 추가를 통해 인덱스 생성 전에 integer로 타입 지정하도록 설정할 수 있다. 


 내가 변경하고자 두 필드는 time_taken과 logdate인데, 이 데이터의 자동으로 생성된 매핑은 아래와 같다.

{
  "mapping": {
    "doc": {
      "properties": {
        //다른 데이터들 생략
        "logdate": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "time_taken": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        }
      }
    }
  }
}

text타입인 위 데이터를 본래의 자료타입과 맞게 integer와 date로 동록하도록 템플릿을 생성하자.


참고로 "yyyy-MM-dd hh:mm:ss"형식인 ISO standard(8601) 시간표기랑 조금 다른 iis 로그(yy-MM-dd hh:mm:ss.SSSS)"는 년도를 2개까지만 입력하므로, 필드 타입이 없으면 에러가 나기때문에 별도로 형식을 지정해줬다.

또 소숫점이 없는 경우 insert 에러가 발생할 수 있으므로, malformed 이벤트가 발생해도 인서트가 되도록 "ignore_malformed"옵션을 true로 지정해줬다.

PUT _template/iis_timetaken
{
  "index_patterns": "kr-*",
  "mappings": {
    "doc": {
      "properties": {
        "time_taken": {
          "type": "integer"
        },
        "logdate": {
          "type": "date",
          "fields": "yy-MM-dd HH:mm:ss.SSS",
          "ignore_malformed": true
        }
      }
    }
  }
}

GET 요청을 통해 등록된 템플릿 내용들을 확인할 수 있다. 내가 직접 등록해놓은 것 말고도 여러가지가 있다.

GET /_template

참고로 템플릿이 등록되면 기존의 매핑이 변경되지 않는다. 새롭게 생성되는 인덱스부터 적용된다.