기본 콘텐츠로 건너뛰기

[Elasticsearch] Elasticsearch Mapping 설정과 2.x, 5.x버전별 차이점 정리

Mappings

Elasticsearch에서 사용하는 Mapping를 대해 알아보도록 하겠습니다. 가장 기본적인 내용이면서 가장 중요한 내용입니다. 초기 Index 생성시 Mappings을 각 Field 용도에 맞춰 설계하는 것이 가장 중요합니다.
Index 생성 시 Mappings를 설정하고 데이터를 색인하게 되면 그 이후로 Mppaings를 변경할 수 없습니다. 단, 추가는 언제든지 가능합니다.
그렇다고 절대로 Mapping를 변경할 수 없는 것은 아닙니다. Alias를 이용하여 백그라운드에서 데이터를 재인덱싱하여 변경하는 방법은 있지만, 이 내용은 여기서 다루지 않겠습니다.
자세한 내용이 궁금하신 분들은 아래 링크를 통해 확인하세요.
기본적으로 Mapping를 설정하지 않아도 Elasticsearch에서 자동으로 설정을 해주지만 조금 더 효율적으로 사용하기 위해 자신이 원하는 Mapping를 설정하는 것이 가장 좋은 방법입니다.
현재 글을 쓰는 시점에는 Elasticsearch 5.5.2 버전이 릴리즈 된 상태입니다. Google에 Mapping 관련 내용 검색 시 대부분의 글들은 2.x 버전 기준의 글이 많아서 5.x 버전 기준으로 작성 후 2.x버전에서 변경된 내용도 함께 정리하겠습니다.

Elasticsearch Document - Mapping 의 기본 분류

  1. Field datatypes
  2. Meta-Fields
  3. Mapping parameters
  4. Dynamic Mapping

Field datatypes

  1. string
    • text and keyword
  2. Numeric datatypes
    • long, integer, short, byte, double, float, half_float, scaled_float
  3. Date datatype
    • date
  4. Boolean datatype
    • boolean
  5. Binary datatype
    • binary
  6. Range datatypes
    • integer_range, float_range, long_range, double_range, date_range
String datatypes 에는 text, keyword 두가지 타입이 있습니다. 이부분은 5.x 버전에서 새롭게 추가된 내용이며, 기존 2.x 버전에서는 stirng 타입으로 동일하게 사용했습니다.
text와 keyword은 둘다 string을 위한 field datatype 입니다. 그렇다면 뭐가 다를까요?
text는 full-text index(전문 검색/색인)를 위한 타입이며, keyword는 일반 index(단순 검색)을 위한 타입니다.
"elasticsearch"를 색인한다고 가정하겠습니다.
text를 사용한다면 저장되는 terms는 elastic, elasticsearch, search 입니다. keyword를 사용한다면 저장되는 terms는 elasticsearch가 됩니다.
간단하게 설정하는 방법을 확인 해보겠습니다.
{
    "text_field": {
        "type": "text",
        "index": true
    },
    "keyword_field": {
        "type": "keyword",
        "index": true
    },
    "keyword_field_not_search": {
        "type": "keyword",
        "index": false
    }
}
여기서 "index": true 의 경우 default이기 때문에 생략이 가능합니다. "index" : flase로 설정하는 경우 검색조차 되지 않기 때문에 필요에 따라 설정합니다.
이번에는 2.x 버전에서 사용했던 방법으로 알아보겠습니다. 먼저 위에서 사용한 설정 방법과 동일한 내용입니다.
{
    "text_field": {
        "type": "stirng",
        "index": "analyzed"
    },
    "keyword_field": {
        "type": "stirng",
        "index": "not_analyzed"
    },
    "keyword_field_not_search": {
        "type": "stirng"",
        "index": "no"
    }
}

2.x와 5.x 차이점 정리

VersionDatatypeInedxText(Stinrg)Terms
2.xstring"analyzed"elasticsearchelastic, search, elasticsearch
2.xstring"not_analyzed"elasticsearchelasticsearch
2.xstring"no"elasticsearch-
5.xtexttrueelasticsearchelastic, search, elasticsearch
5.xkeywordtrueelasticsearchelasticsearch
5.xkeywordfalseelasticsearch-

새로운 Index 생성 및 Mapping 설정

Elasticsearch 5.x 버전
PUT https://elasticsearch-host:9200/my_index
{
  "settings": {
    "index": {
      "number_of_shards": 10,
      "number_of_replicas": 1,
      "refresh_interval": "10s"
    }
  },
  "mappings": {
    "my_type": {
      "properties": {
        "text_field": {
          "type": "text",
          "index": true
        },
        "keyword_field": {
          "type": "keyword",
          "index": true
        },
        "integer_field": {
          "type": "integer",
          "index": true,
          "ignore_malformed": true
        },
        "ip_field": {
          "type": "ip",
          "index": true
        },
        "integer_field_index_false": {
          "type": "integer",
          "index": false,
          "ignore_malformed": true
        },
        "keyword_field_index_false": {
          "type": "keyword",
          "index": false
        },
        "object_field": {
          "properties": {
            "text-field": {
              "type": "text",
              "index": true
            },
            "keyword_field": {
              "type": "keyword",
              "index": true
            },
            "integer_field": {
              "type": "integer",
              "index": true,
              "ignore_malformed": true
            }
          }
        }
      }
    }
  }
}
Elasticsearch 2.x 버전
PUT https://elasticsearch-host:9200/my_index
{
  "settings": {
    "index": {
      "number_of_shards": 10,
      "number_of_replicas": 1,
      "refresh_interval": "10s"
    }
  },
  "mappings": {
    "my_type": {
      "properties": {
        "text_field": {
          "type": "string",
          "index": "analyzed"
        },
        "keyword_field": {
          "type": "string",
          "index": "not_analyzed"
        },
        "integer_field": {
          "type": "integer",
          "index": "not_analyzed",
          "ignore_malformed": true
        },
        "ip_field": {
          "type": "ip",
          "index": "not_analyzed"
        },
        "integer_field_index_false": {
          "type": "integer",
          "index": false,
          "ignore_malformed": true
        },
        "keyword_field_index_false": {
          "type": "string",
          "index": false
        },
        "object_field": {
          "properties": {
            "text-field": {
              "type": "string",
              "index": "analyzed"
            },
            "keyword_field": {
              "type": "string",
              "index": "not_analyzed"
            },
            "integer_field": {
              "type": "integer",
              "index": "not_analyzed",
              "ignore_malformed": true
            }
          }
        }
      }
    }
  }
}
P.S - refresh_interval 설정은 색인하는 주기를 설정하는 값입니다. 검색 관련 성능 향상을 위해 변경이 가능하며 대부분의 길에 성능을 위해 설정하는 경우 30s으로 설정하는 경우를 많이 보았습니다. 각자 운영하는 elasticsearch 상황에 따라서 설정하면 될 것 같습니다. 위 내용은 다음에 기회가 되는 경우 자세하게 포스팅하겠습니다.
짧게 상대적으로 많이 사용될 것으로 예상되는 기초적인 내용 위주로 정리하였습니다. 더 많은 정보를 원하는 경우 Elasticsearch 공식 Document를 확인해주세요.

참고 자료

ElasticSearch Document - Mapping
jjeong blog - Elastic

댓글

이 블로그의 인기 게시물

[Github] Windows 환경에서 Git 자격 증명 변경 (자격 증명 변경)

오늘 Git 계정을 새로 생성하여 Git config 사용자 정보를 변경후 푸쉬하는 도중 에러가 발생하여 상당 시간 삽질한게 있어 내용 기록합니다. 새로운 계정에서 repository 생성 후 VS Code를 사용하여 git push를 하려고하니 사용자 때문에 에러가 발생하더군요. 에러 내용은 아래처럼 발생했습니다. # git push remote: Permission to yunseul-light/elasticsearch-study.git denied to Maruhan. fatal: unable to access 'https://github.com/yunseul-light/elasticsearch-study.git/': The requested URL returned error: 403 repository에 해당하는 폴더 .git 파일 내용과 git config 를 이용한 사용자 변경 등 여러가지를 해봤지만 결국 같은 에러가 발생해습니다. 해결 방안 Windows 환경에서 git 사용자 계정을 변경하기 위해서는 위 스크린샷과 같이 제어판에서 편집을 해야합니다.  1. 제어판 - 사용자 계정 - 자격 증명 관리자 2. Windows 자격 증명 3. 일반 자격 증명 4. git 관련 자격 증명 편집 다들 알고있는 내용지만 혹시 저 같은 실수 하시는 분들을 위해 혹시 몰라 남겨둡니다. P.S 위에서 언급했던 git config 관련 내용 추가합니다. git config를 이용한 계정 설정 # git config --global user.name "YunSeul" # git config --global user.email "yunseul.light@gmail.com" config를 이용한 user 설정 후 commit 하는 경우 commit을 시도하는 사용자에 대한 정보가 위에서

[Logstash] Logstash, Logstash-plugin 설치

Logstash Logstash는 기본적으로 다양한 소스를 효율적으로 수집을 할 수 있게 도와주는 오픈소스입니다. 입력, 필터, 출력 3가지 단계가 있으며 각 단계별로 다양한 플러그인이 있어 다양한 서비스 사이에서 사용될 수 있죠. Logstash 다운로드 최신 버전 다운로드 :  https://www.elastic.co/kr/downloads/logstash 지난 버전 다운로드 (Past Releases) :  https://www.elastic.co/kr/downloads/past-releases 링크로 이동하면 logstash를 받을 수 있으며 저는 logstash-5.5.0 버전을 사용하여 글을 작성중입니다. 아래 설치 및 실행관련 부분은 리눅스 환경을 기준으로 적었으며, 윈도우 환경에서도 동일하게 진행하면 문제 없이 사용가능합니다. Getting Started with Logstash logstash 설치는 정말 간답합니다. 위에서 다운로드 받은 tar파일을 원하는 서버에 다운받아 압축을 풀면 모든 준비는 끝났습니다. 다운로드 및 설치 요약 # wegt 'https://artifacts.elastic.co/downloads/logstash/logstash-5.5.0.tar.gz' # tar -xvf ./logstash-5.5.0.tar.gz # cd ./logstash-5.5.0 # ls -al 합계 228 drwxr-xr-x. 12 root root 4096 2017-07-12 09:30 . dr-xr-x---. 35 root root 4096 2017-08-17 09:50 .. -rw-r--r--. 1 root root 111573 2017-07-01 08:51 CHANGELOG.md -rw-r--r--. 1 root root 2249 2017-07-01 08:51 CONTRIBUTORS -rw-r--r--. 1 root root 3874 2017-07-12 11:14 Gem