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
참고로 템플릿이 등록되면 기존의 매핑이 변경되지 않는다. 새롭게 생성되는 인덱스부터 적용된다.
'ELK' 카테고리의 다른 글
[ES] 도커를 이용해 인덱스 주기적으로 삭제하기 (1) | 2019.04.02 |
---|---|
[ES] 403 index read-only 에러가 발생했을 때 (0) | 2019.03.10 |