Elasticsearch

Elasticsearch - Mappings

illho 2024. 4. 11. 21:39

문자열 - text, keyword

 

elasticsearch 에서 문자열 타입에는 text, keyword 두 가지가 있다.

인덱스를 생성할 때 매핑에 필드를 미리 정의하지 않으면 동적 문자열 필드가 생성 될 때 text 필드와 keyword 필드가 다중 필드로 같이 생성된다.

 

text

text 타입은 입력된 문자열을 텀 단위로 쪼개어 역 색인 구조를 만든다.

보통 풀 텍스트 검색에 사용할 문자열 필드들을 text 타입으로 지정한다.

text 필드에 설정가능한 옵션 들은 다음과 같다.

 

analyzer : <애널라이저명> : 색인에 사용할 애널라이저를 입력하며 디폴트로는 standard 애널라이저 이다.

토크나이저, 토큰필터들을 따로 지정할 수 가 없으며 필요시 사용자 정의 애널라이저를 settings에 정의 해 두고 사용한다.

 

search_analyzer : <애널라이저명> : 기본적으로 text 필드는 match 쿼리로 검색을 할 때 색인에 사용한 동일한 애널라이저로 검색쿼리를 분석한다. search_analyzer 를 지정하면 검색시에는 색인에 사용한 애널라이저가 아닌 다른 애널라이저를 사용한다. 

 

index : <true | false> - 디폴트는 true 이다. false로 설정하면 해당 필드는 역 색인을 만들지 않아 검색이 불가능하다.

 

fielddata : <true | false> - 디폴트는 false 이다. true로 설정하면 해당 필드의 색인된 텀 들을 가지고 집계 또는 정렬이 가능하다. 

 

 keyword

keyword 타입은 입력된 문자열을 하나의 토큰으로 저장한다. text 타입에 keyword 애널라이저를 적용한 것과 동일하다.

보통은 집계 또는 정렬에 사용할 문자열 필드를 keyword 타입으로 지정한다. 

keyword 필드에 설정 가능한 옵션들은 다음과 같다.

 

index 설정은 text 필드와 동일하다.

 

doc_values : <true | false> - 디폴트는 true 이다. keyword 값들은 기본적으로 집계나 정렬에 메모리를 소모하지 않기 위해 값들을 doc_values 라고 하는 별도의 columnar store 를 만들어 저장한다. 

이 값을 false 로 하면 doc_values 에 값을 저장하지 않아 집계나 정렬이 불가능해진다.

 

ignore_above : <자연수> - 디폴트는 2,147,483,647 이며 다이나믹 매핑으로 생성되면 ignore_above : 256로 설정이 된다.

설정된 길이 이상의 문자열은 색인을 하지 않아 검색이나 집계가 불가능하다. 

 

normalizer : <노멀라이저명> - keyword 필드는 애널라이저를 사용하지 않는 대신 노멀라이저의 적용이 가능하다.

노멀라이저는 애널라이저와 유사하게 settings 에서 정의하며 토크나이저는 적용할 수 없고 캐릭터 필터와 토큰 필터만 적용해서 사용이 가능하다.

 

숫자 - long double...

elasticsearch는 자바에서 기본으로 사용되는 숫자 타입들을 지원한다.

half_float , scaled_float 과 같이 elasticsearch 에서만 사용되는 타입들도 있다.

 

long : 64비트 정수

integer : 32비트 정수

short : 16비트 정수

byte : 8비트 정수

double : 64비트 실수

float : 32비트 실수

half_float : 16비트 실수

scaled_float : 실수형이지만 부동소수점이 아니라 long 형태로 저장하고 옵션으로 소수점 위치를 지정한다.

 

모든 숫자 필드들에 공통적으로 설정 가능한 옵션들을 text, keyword 필드의 옵션과 동일하다.

index, doc_values, boost 옵션들을 text, keyword 필드의 옵션들과 동일하다.

 

coerce : true | false - 디폴트는 true 이다.

숫자 필드들은 기본적으로 숫자로 이해될 수 있는 값들은 숫자로 변경해서 저장한다.

예를 들어 integer 필드에 4, "4", 4.5 등을 입력하면 모두 자연수 4로 자동으로 변환되어 저장된다.

false로 설정하면 정확한 타입으로 입력되지 않으면 오류가 발생한다.

 

null_value : <숫자값> - 필드값이 입력되지 않거나 null 인 경우 해당 필드의 디폴트 값을 지정한다.

 

ignore_malforemd : <true | false> - 디폴트는 false 이다. 기본적으로 숫자 필드에 숫자가 아닌 문자나 불린 값이 들어오면 elasticsearch는 오류를 리턴한다. true로 설정하게 되면 숫자가 아닌 값이 들어와도 도큐먼트를 정상적으로 저장한다.

 

scaling_factor : <10의 배수> - scaled_float 를 사용하려면 필수로 지정해야 하는 옵션이다.

소수점 몇 자리까지 저장할지를 지정한다. 12.3456 이라는 값을 저장하는 경우 scaling_factor : 10으로 설정했으면 12.3이 저장 된다. 100으로 설정하면 12.34가 저장된다.

 

날짜 - date

elasticsearch 에서 날짜 타입은 ISO8601 형식을 따라 입력을 한다.

아래와 같은 형태들은 자동으로 날짜 타입으로 인식된다.

 

"2024-04-11"

"2024-04-11T20:15:20"

"2024-04-11T20:15:20+09:00"

"2024-04-11T20:15:20.428Z"

 

ISO8601 형식이 아니라 "2024/04/11 15:13:12" 와 같이 입력하면 보통 text, keyword 로 저장된다.

필드가 date 형으로 정의 된 이후에는 long 타입의 정수를 입력하면 날짜 형태로 저장이 가능하다.

이 외에도 1970-01-01 00:00:00 부터의 시간을 밀리초 단위로 카운트 한 값인 epoch_millis 형태의 입력도 가능하다.

"2024/04/11 15:14:30" 같은 형식으로 날짜를 저장하려면 format 옵션을 사용해서 형태를 지정해야 한다.

 

날짜 타입에서 사용 가능한 옵션들은 다음과 같다

 

doc_values, index, null_value, ignore_malformed 옵션들은 문자열, 숫자 필드와 기능이 동일하다.

 

format : <문자열 || 문자열...> - 입력 가능한 날짜 형식을 ||로 구분해서 입력한다.

 

날짜 필드는 입력된 값들을 실제로 내부에서는 모두 long 형태의 epoch_millis 로 저장한다. 

또한 매핑의 format 형식만 지정 해 놓으면 지정된 어떤 형식으로도 색인 및 쿼리가 가능하다.

 

boolean 

boolean 은 true 와 false 두가지 값을 갖는 필드 타입이다.

type : boolean 로 한다.

"true" 와 같이 문자열로 입력이 되어도 true로 해석이 되어 저장된다.

boolean 필드를 사용 할 때는 일반적으로 term 쿼리를 이용해서 검색을 한다.

 

boolean 필드에서 사용 가능한 옵션은 다음과 같다.

doc_values, index 옵션들은 문자열,숫자 필드와 기능이 동일하다.

null_value : <true | false> - 필드가 존재하지 않거나 값이 null 일 때 디폴트 값을 지정한다.

지정하지 않으면 boolean 필드가 없거나 값이 null인 경우 존재하지 않는 것으로 처리되어 true / false 모두 쿼리나 집계에 나타나지 않는다.

 

Object

JSON 에서는 한 필드 안에 하위 필드를 넣는 object, 즉 객체 타입의 값을 사용할 수 있다.

 

ex) user 인덱스에 하위 필드를 가진 object 타입 info 필드의 예시이다.

PUT user/_doc/1
{
	"info": {
    	"name" : "user1",
        "age" : 18,
        "tel" : "01012345678"
	}
}

 

object 필드를 선언할 때는 properties 를 입력하고 그 아래에 하위 필드 이름과 타입을 지정한다.

 

PUT user
{
	"mappings": {
    "properties": {
      "characters": {
        "properties": {
          "name": {
            "type": "text"
          },
          "age": {
            "type": "byte"
          },
          "tel": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

 

object 필드를 쿼리로 검색 하거나 집계를 할 때는 마침표 . 를 이용해서 하위 필드에 접근한다.

 

GET user/_search
{
  "query": {
    "match": {
      "info.name": "user1"
    }
  }
}

 

멀티 필드 - Multi Field

elasticsearch 의 도큐먼트에는 하나의 필드값만 있지만 이 필드의 값을 여러 개의 역 색인 및 doc_values 들로 저장할 수 있는 다중 필드, 즉 멀티 필드 기능이 있다. 

 

ex) 

PUT my_index
{
  "mappings": {
    "properties": {
      "<필드명1>": {
        "type": "text",
        "fields": {
          "<필드명2>": {
            "type": "<타입>"
          }
        }
      }
    }
  }
}

 

보통은 text 타입 아래에 keyword 타입을 같이 정의하기 위해 사용된다.

하나의 텍스트 필드에 여러 개의 애널라이저를 적용하기 위해서도 사용할 수 있다.

 

 

 

reference

https://esbook.kimjmin.net/07-settings-and-mappings/7.2-mappings/7.2.3-date