[ElasticSearch] 매핑 Mapping과 설정 Setting

참고한 링크 및 문헌

7.1 설정 - Settings
참고한 도서 📚 시작하세요! 엘라스틱서치

모든 인덱스는 setting과 mapping 두 개의 정보 단위를 갖고 있다.
인덱스를 처음 생성한 뒤 GET <인덱스명> 으로 조회하면 설정(settings) 그리고 매핑(mappings) 정보를 확인할 수 있다.

매핑(_mapping)

매핑은 데이터의 저장 형태와 검색 엔진에서 해당 데이터에 어떻게 접근하고 처리하는지에 대한 명세다.
엘라스틱서치의 매핑은 보통 관계형 데이터베이스 시스템의 스키마에 비유되며 인덱스/타입 단위로 지정된다.

엘라스틱서치에서 매핑을 설정하는 방법은 크게 2가지이다.
첫번째는 인덱스를 생성하면서 매핑을 설정하는 방법, 두 번째는 mapping API를 통해 매핑을 설정하는 방법이다.

도큐먼트에 입력될 데이터의 매핑 형태를 정의할 때는 properties 필드에 필드명과 타입 등의 옵션을 입력해서 설정한다.
메소드는 PUT 메소드를 사용한다.

{	
	"mappings" : {
    	"<타입명>" : {
        	"properties" : {
            	매핑내용
                }
           }
     }
}

엘라스틱서치에서 생성되지 않은 인덱스에 처음 데이터를 입력하면 자동으로 인덱스가 생성되면서 매핑 설정이 된다.
인덱스/타입 매핑을 확인하고 싶을 때는 인덱스/타입/_mapping 을 주면된다.

기존 매핑에 필드 추가하기

기존에 생성된 매핑에 필드를 추가하려면 PUT 메소드로 _mapping API를 사용해야 한다.

PUT 호스트/인덱스/_mapping/타입
{
	"<타입명>" : {
    	"properties" : {
        	매핑내용
          }
      }
}

명심할 점은 한번 설정된 매핑에 추가는 가능하지만 변경과 삭제는 되지 않는다는 점이다.

내장필드

엘라스틱서치의 매핑은 도큐먼트 데이터의 스키마 구조를 정의하는 기능이 있다.
또한 내부적으로 제공하는 기능들을 이용해서 메타 정보를 설정하고 데이터를 처리하는 방법을 설정할 수 있다.

  • id : 도큐먼트의 아이디에서 index에 색인 여부를 설정하거나 stroe 옵션을 통해 아이디의 저장 여부를 설정할 수 있다
{
	"mappings" : {
    	"타입명" : {
        	"내장 필드명" : {
            	필드 내용

데이터 타입

인덱스를 생성할 때 데이터의 매핑 정보는 properties 옵션 내부에 데이터의 필드명과 속성 정보들을 입력해서 설정한다,

참고로 인덱스에 생성될 모든 타입의 필드에 동일한 매핑 설정을 적용하고 싶다면 타입 명 대신 _default를 입력하고 설정값을 지정해서 매핑해주면 된다.

데이터 타입은 string, integer/long, float/double, boolean과 객체와 같은 확장 타입이 있다.

문자열

문자열은 엘라스틱서치에서 가장 많이 사용되는 데이터 타입이다. 특히 엘라스틱서치에서 문자열은 분석기(analyzer)의 설정에 따라 색인과 검색에 영향을 가장 많이 미친다.

문자열에 사용되는 옵션들은 아래와 같다.

  • store : 기본값은 false 이며 해당 필드의 값을 저장하지 않는다. 일반적으로 데이터가 색인될 때 _source에 데이터 원본이 저장되므로 해당 옵션이 false여도 검색이 가능하다.
  • index : 분석기 적용 여부를 표현한다
  • analyzed , not_analyzed, no
  • boost : 필드에 가중치를 부여해서 검색 결과의 우선순위에 영향을 준다. 기본값은 1.0이며 값이 높을 수록 해당 필드의 검색 결과 점수 비중이 높아진다.
  • analyzer : 데이터 색인과 문자열 검색에 사용될 분석기를 지정한다. 적용을 위해서는 index 옵션에서 analyzed 설정이 되어있어야 한다.
  • index_analyzer : 데이터 색인에 사용될 분석기를 지정한다.
  • search_analyzer : 문자열 검색에 사용될 분석기를 지정한다.
  • include_in_all : _all 매핑 필드가 적용된 경우 색인 여부를 지정한다.

객체

엘라스틱서치의 필드는 객체 타입 값을 저장할 수 있다.
엘라스틱서치에서는 객체의 메서드는 포함하지 않고 이름: 값 형식의 값데이터를 포함하고 있다.
형태는 아래와 같다.

"mappings" : {
	"<타입명>": {
    	"properties" : {
        	"<상위 데이터 필드명>" : {
            	"type" : "object",
                	"properties" : {
                    	"<하위 데이터 필드명>" : {
                        데이터 필드 내용 
                        }

예를 들어, 아래와 같이 설정할 수 있다.

"mappings" : {
	"test_user": {
    	"properties" : {
        	"user" : {
            	"type" : "object",
                	"properties" : {
                    	"name" : { "type" : "string"},
                        "age" : {"type" : "integer"},
                        "married" : {"type" : "boolean"}
                        }

다중필드 (MultiFields)

엘라스틱서치에서는 데이터가 입력될 때 하나의 필드 값을 서로 다른 설정의 여러 필드에 자동으로 반복해서 저장되게 하는 다중필드 기능을 제공한다.

예를 들어 books 인덱스의 title 필드에 "The Prince and the Pauper"라는 값이 색인되는 경우를 생각해보자.
title 필드의 index 옵션이 analyzed인 경우에는 해당 값이 형태소 분석을 거쳐 단어마다 색인되는데 옵션이 not_analyzed라면 분석이 안돼서 해당 내용을 통째로 검색해야 결과가 나오게 된다.

만약 어떤 경우에는 prince로 검색하고 어떤 경우에는 정확히 데이터 통째를 검색해야 매치하는 값이 나오도록 하고 싶을 때는 다중필드 옵션을 사용할 수 있다.

"mappings" : {
	"book" : {
    	"properties" : {
        	"title" : {
            	"type" : "string",
                "index" : "analyzed",
                "fields" : {
                	"raw(다중필드 특징을 나타내는 이름 설정하기" : {"type" : "string" , "index" : "not_analyzed"}

이렇게 매핑한 뒤 데이터를 입력할 때는 그냥 "title"에 값을 넣어주면 된다. 그리고 default값은 항상 다중필드 부분인 fields 안의 내용이 아닌 그 외부의 설정이 default값이 된다.

그렇다면 raw 옵션( 통째로 검색해야 결과가 나오도록) 하려면 어떻게 하면 될까?

http://localhost:9200/books/_search

"query" : {
	"term" : {
    	"title.raw" : "The Prince and the Pauper"}
     }
}

위의 코드처럼 query로 조회를 할 때 해당 필드에 다중필드 옵션을 따로 지정해주면 된다!

설정 Setting

number_of_shards, number_of_replicas

프라이머리 샤드 수와 리플리카는 다음과 같은 number_of_shards, number_of_replicas 변수로 설정한다.
대부분의 설정들은 settings 아래의 index 아래 설정에 명시된다.
그러나 index 레벨은 생략하고 입력해도 정상적으로 입력이 되긴 한다.

refresh_interval

자주 사용되는 설정 중에 refresh_interval이 있다.
엘라스틱서치에서 세그먼트가 만들어지는 리프레시 타임을 설정하는 값인데 기본은 1초이다.
마찬가지로 settings 의 index 아래에 설정한다.

analyzer, tokenizer, filter

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "type": "custom",
          "char_flter": [ "...", "..." ... ]
          "tokenizer": "...",
          "filter": [ "...", "..." ... ]
        }
      },
      "char_filter":{
        "my_char_filter":{
          "type": "…"
          ... 
        }
      }
      "tokenizer": {
        "my_tokenizer":{
          "type": "…"
          ...
        }
      },
      "filter": {
        "my_token_filter": {
          "type": "…"
          ...
        }
      }
    }
  }
}

settings 아래 analysis 아래 각 analyzer, char_filter, tokenizer, filter 를 입력한다.

analysis 내용은 한 번 생성 후 변경이 불가능하다.
이미 만들어진 인덱스에 애널라이저나 토크나이저등을 추가하거나 사전을 변경하려면 인덱스를 먼저 _close 한 후에 추가하고 다시 _open해서 적용할 수 있다.

좋은 웹페이지 즐겨찾기