Elasticsearch는 분산 시스템을 기본적으로 지원하는 전문 검색(full-text search) 오픈 소스 프로젝트로, "검색"을 쉽게 접근할 수 있게 해주는 강력한 도구이다. 나중에 전반적으로 설명할 기회가 있다면 더 이야기하기로 하고, 이 글에서는 간단히 Elasticsearch의 index 및 type의 mapping 관리에 대해 내가 경험한 것들을 정리한다.

mapping이란?

Elasticsearch를 처음 접하고 공식 getting started 가이드를 따라 하나씩 해보는 사람이라면, 이 mapping이라는 개념을 쉽게 지나치게 된다. 왜냐하면 getting started 가이드에서는 샘플 데이터를 바로 index해버리고 검색해서 "짠 하고 검색이 된다"로 끝나기 때문이다. 다행히도 Elasticsearch는 "선 index - 후 mapping"이 가능하기 때문에 이런 튜토리얼이 가능하다. Mapping이 정해지지 않은 index (혹은 index type)에 무작정 문서를 갈아 넣어도 Elasticsearch는 자동으로 문서의 내용을 보고 자동으로 최선의 data type을 지정해주기 때문이다.

뒤늦게 얘기하는 것이지만, mapping은 관계형 데이터베이스(RBDMS)의 schema와 비슷한 개념으로, Elasticsearch의 index에 들어가는 데이터의 타입을 정의하는 것이다. 물론 그 외에도 수 많은 기능을 설정하는 기능이 있지만 결국 mapping의 가장 중요한 역할은 데이터의 유형을 정의하고, 그 데이터를 어떻게 index하는지 결정하는 것이다.

공식 getting started 가이드에서는 다음과 같이 문서 하나를 무작정 집어넣는다.


PUT /customer/external/1?pretty
{
  "name": "John Doe"
}

그럼 이제 Elasticsearch가 mapping을 어떻게 만들어 놓았는지 보자.


// REQUEST
GET /customer/external/_mapping

// RESPONSE
{
  "customer": {
    "mappings": {
      "external": {
        "properties": {
          "name": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }
        }
      }
    }
  }
}

Mapping을 따로 지정한 적이 없지만 이미 customer 인덱스에 external이라는 type이 생성되었고 거기에 mapping까지 만들어져 있는 것을 확인할 수 있다. Elasticsearch는 name의 값이 John Doe로 문자열인 것을 확인하고, 문자열을 위해 이미 지정된 기본 data type을 지정한 것이다. 조금 더 자세하게 살펴보자면 external type은 name이라는 필드를 갖고 있는데, 그 데이터 타입은 text이고, 추가적인 필드 keyword를 만들어서 그 데이터 타입을 keyword라고 설정했음을 알 수 있다.

그래서 뭐가 문제인가? 이렇게 자동으로 생성된 mapping 아래에서 편히 써보다가 슬슬 mapping을 데이터 타입을 변경하고 싶어지게 된다. 그런데 elasticsearch는 한 번 정의된 mapping은 변경할 수가 없다. 새로운 필드를 추가하거나 새로운 type의 mapping을 정의할 수는 있지만, 한 번 정해지면 되돌릴 수 없는 것이다. 결국 유일한 방법은 새로운 index를 만들어 내가 원하는 mapping을 정의하고, 원래 있던 자료를 옮겨다 놓는 것 뿐이다.

Elasticsearch가 정해 놓은 규칙 안에서 안전하고 index mapping을 쓰는 법을 간단하게 정리한다.

  1. 선 mapping - 후 index
    Elasticsearch의 자동 mapping 생성을 믿지 말자. 먼저 내가 어떤 데이터를 넣을 지 분석해서 mapping을 확실하게 먼저 정의한다.

  2. Mapping template, indexing script는 꼭 저장
    내가 분석해서 정의한 mapping은 json 파일 등의 자신이 편한 방법으로 저장해 놓자. 그리고 데이터를 갈아넣으려면 코딩을 하게 되므로 그 코드도 저장하자. 추후에 mapping 변경으로 인해 데이터를 옮기게 될 때에 사용하게 된다.

  3. Alias를 지정해 놓으면 index를 이리 저리 옮길 때 검색하기 편해진다

  4. Index의 하나의 type을 초기화하고 싶으면 delete_by_query 기능을 이용해서 해당 type의 내용물만 지울 수 있다

추후 더 경험이 쌓여 내용이 업데이트되기를 바란다.

  • ohoroyoi 2019.09.09 11:25

    글 감사합니다

    BlogIcon 동건 2019.09.14 11:43 신고

    저도 댓글 감사해요