[TIL] Elasticsearch: Index template과 dynamic/explicit mapping
포스트
취소

[TIL] Elasticsearch: Index template과 dynamic/explicit mapping

Problem to resolve

로그를 Elasticsearch에 적재하고 있고, 로그 인덱스는 dynamic mapping을 사용하고 있다

로그 인덱스에서 message.response.body라는 필드가 부분 텍스트 검색이 되지 않는 문제를 발견했다.

Background

Dynamic mapping에 대해서 간단히 살펴보자.

인덱스의 mapping을 조회해보면 top-level에서 dynamic = true로 설정된 것을 볼 수 있다 (기본값이 true)

https://www.elastic.co/guide/en/elasticsearch/reference/current/dynamic.html

dynamic mapping이 이점도 있지만 가끔 다른 형태의 값이 들어오면 잘못된 타입으로 매핑되는 등의 이슈가 있다. 예를 들면 datetime 타입의 필드의 타입이 갑자기 바뀌는 문제가 있었다.

이번 케이스는 message.response.body 필드의 타입이 keyword로 매핑된 것이 원인이었다. 이 필드의 타입을 text로 바꿔주면 된다.

How to solve

Elasticsearch에는 index template이라는 것이 존재한다. index template은 특정 패턴(e.g. log-* pattern)의 index가 생성되면 해당 인덱스의 mapping 등 기본 설정을 제공해준다.

https://www.elastic.co/guide/en/elasticsearch/reference/current/index-templates.html

index template의 mapping을 수정하면 특정 필드들의 타입을 명시적으로 매핑해주도록 할 수 있다. mappings의 properties 필드에 값을 추가하면 된다

1
2
3
4
5
6
7
8
9
{
  "mappings": {
    "properties": {
      "age":    { "type": "integer" },  
      "email":  { "type": "keyword"  }, 
      "name":   { "type": "text"  }     
    }
  }
}

https://www.elastic.co/guide/en/elasticsearch/reference/current/explicit-mapping.html

Kibana UI에서는 아래와 같다. Kibana admin에 접속해야 한다.

Stack management -> index management -> index templates

template 검색 후 template 선택 -> manage -> Edit

kibana-index-template

Edit 페이지 접근 후 Step 4: Mapping를 클릭한다.

그럼 Mapped fields 탭에서 Add field 버튼을 통해 필드 이름과 타입을 지정하여 필드를 추가할 수 있다. 필드 추가를 완료하고 index template을 저장하면 된다.

Tip: multi-field property

multi-field: 추가된 필드 옆에는 Add a multi-field 버튼이 노출된다. 이 버튼을 눌러서 multi-field를 추가할 수 있다.
예를 들어, service (text) 타입이 있다면 service 필드에 multi-field를 추가하여 service.keyword (keyword)와 같은 필드를 추가할 수 있다. 이렇게 설정하면 service 필드에서는 부분 검색을, service.keyword 필드에서는 keyword 검색을 할 수 있다. 의도하지 않은 부분 검색을 피할 수 있다.
keyword 필드의 경우 Index pattern에서 aggregatable 속성이 활성화된다. 이를 통해 Kibana aggregation을 통해 grouping 등의 기능을 활용해볼 수 있다.

마지막 단계: Index template 수정 후 index rollover

Index template을 수정해도 이미 생성된 index들의 mapping은 변경되지 않는다. 다음 index가 rollver 되어 생성되기를 기다리거나, rollover API를 호출해야 한다.

index rollover에 대한 내용은 다음 포스팅에서 소개하겠다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.

[TIL] JIT compiler in Java HotSpot VM, and C1 vs C2 compiler mode

[TIL] Spring MVC: Multiple ControllerAdvices & Order