개발 & 데이터베이스/Elasticsearch

Elasticsearch 메타 필드 종류와 필드 데이터 타입

K.두부 2024. 1. 30. 13:19
반응형

메타 필드

엘라스틱서치에서 생성한 문서에서 제공하는 특별한 필드다. 이것은 메타데이터를 저장하는 특수 목적의 필드로서 이를 이용하면 검색 시 문서를 다양한 형태로 제어하는 것이 가능해진다.

 

GET drama_search/_doc/1

------------ 결과 ------------

{
  "_index": "drama_search",
  "_id": "1",
  "_version": 1,
  "_seq_no": 0,
  "_primary_term": 1,
  "found": true,
  "_source": {
    "dramaCd": "20240125",
    "dramaNm": "제목 없음",
    "dramaNmEn": "not title",
    "prdtYear": "2024",
    "openDt": "",
    "companies": [],
    "directors": [
      {
        "peopleNm": "홍길동"
      }
    ]
  }
}

 

색인된 문서를 조회한 결과로 _source 항목에 실제 문서의 정보를 담고 있고, 그 밖에 항목들은 엘라스틱서치가 직접 생성한 메타 필드다.

 

POST drama_search/_search
{
 "size":0,
  "aggs": {
    "indices": {
      "terms": {
        "field": "_index",
        "size": 10
      }
    }
  }
}

 

field 부분을 변경해주면서 조회하면 된다.

 

메타 필드 비고
_index 인덱스명과 해당 인덱스에 몇 개의 문서가  있는지 확인할 수 있음.
_type 매핑의 타입 정보와 해당 인덱스 내부에서 타입별로 몇 개의 문서가 있는지 확인할 수 있음.
_id 문서를 식별하는 유일한 키 값.
_uid 특수한 목적의 식별키로 '#' 태그를 사용해 _type과 _id값을 조합해 사용함.
(내부적으로만 사용되기 때문에 검색 시 조회되는 값을 아님)
_source 문서의 원본 데이터를 제공한다. 일반적으로 원본 JSON 문서를 검색 결과로 표시할 때 사용함.
_all 색인에 사용된 모든 필드 정보를 가짐.
_routing 특정 문서를 특정 샤드에 저장하기 위해 사용자가 지정하는 메타 필드. 

 

 

 

필드 데이터 타입

1) Keyword

별도의 분석기를 거치지 않고 원문 그대로 색인하기 때문에 검색 시 필터링되는 항목, 정렬이 필요한 항목, 집계해야 하는 항목에 주로 사용된다.

 

'elastic search'로 입력했을 경우 elastic, search로는 절대 검색되지 않는다.

 

주요 파라미터로는 boost, doc_values, index, null_value, store이 있다.

 

boost: 필드의 가중치로, 검색 결과 정렬에 영향을 줌.

doc_values: 필드를 메모리에 로드해 캐시로 사용함. (default: true)
index: 해당 필드를 검색에 사용할지 설정 (default: ture)
null_value: 기본적으로 데이터의 값이 없으면 필드를 생성하지 않지만 null 로 필드의 값을 대체할지 설정

store: 필드 값을 필드와 별도로 _source에 저장하고 검색 가능하게 할지 설정 (default: false)

 

 

2) Text

지정된 분석기가 칼럼의 데이터를 문자열 데이터로 인식하고 분석함. 전문 검색이 가능하다는 점이 가장 큰 특징으로 전체 텍스트가 토큰화되어 생성되기 때문에 특정 단어 검색이 가능함.

 

PUT drama_text/_mapping
{
  "properties": {
    "dramaComment": {
      "type": "text",
      "fields": {
        "dramaComment_keyword" : {
          "type" : "keyword"
        }
      }
    }
  }
}

 

검색뿐 아니라 정렬이나 집계 연산을 사용해야할 경우, 위처럼 Text 타입과 Keyword 타입을 동시에 갖도록 멀티 필드로 설정할 수 있다.

 

주요 파라미터로는 analyzer, boost, fielddata, index, norms, store, search_analyzer, similarity, term_vector이 있다.

 

analyzer: 인덱스와 검색에 사용할 형태소 분석기를 선택 (default: Standard Analyzer)

boost: 필드의 가중치로, 검색 결과 정렬에 영향을 줌.

fielddata: 정렬, 집계, 스크립트 등에서 메모리에 저장된 필드 데이터를 사용할지 설정 (default: false)

index: 해당 필드를 검색에 사용할지 설정 (default: true)

norms: 유사도 점수를 산정할 때 필드 길이를 고려할지 결정 (default: false)

store: 필드 값을 필드와 별도로 _soruce에 저장하고 검색 가능하게 할지 설정 (default: false)

search_analyzer: 검색에 사용할 형태소 분석기를 선택

similarity: 유사도 점수를 구하는 알고리즘을 선택 (default: BM25)
term_vector: Analyzed 필드에 텀벡터를 저장할지 결정 (default: no)

 

 

3) Array

대부분 1차원으로 표현되지만 2차원으로 존재하는 경우도 있다. 모든 필드가 기본적으로 다수의 값을 가질 수 있기 때문에 매핑 설정 시 Array 타입을 명시적으로 정의하지 않는다.

 

 

4) Numeric

엘라스틱서치에서 숫자 데이터 타입은 여러 가지 종류가 제공된다. 데이터의 크기에 알맞은 타입을 제공함으로써 색인과 검색을 효율적으로 처리하기 위함.

 

데이터 타입 설명
long 최솟값과 최댓값을 가지는 부호 있는 64비트 정수
integer 최솟값과 최댓값을 가지는 부호 있는 32비트 정수
short 최솟값과 최댓값을 가지는 부호 있는 16비트 정수
byte 최솟값과 최댓값을 가지는 부호 있는 8비트 정수
double 64비트 부동 소수점을 갖는 수
float 32비트 부동 소수점을 갖는 수
half_float 16비트 부동 소수점을 갖는 수

 

 

5) Date

날짜는 다양하게 표현될 수 있기 때문에 올바르게 구문 분석될 수 있게 날짜 문자열 형식을 명시적으로 설정해야 한다. 별도의 형식을 지정하지 않을 경우, 기본 형식인 'yyyy-MM-ddTHH:mm:ssZ' 로 지정된다.

 

 

6) Range

범위가 있는 데이터를 저장할 때 사용하는 타입이다. 시작과 종료 데이터만 입력해주면 된다.

PUT drama_search/_mapping
{
  "showRange": {
    "gte": "2024-01-01",
    "lte": "2024-02-01"
  }
}

 

 

7) Boolean

참과 거짓이라는 두 논리값을 가지는 데이터 타입이다. 

 

 

8) Geo-Point

위도와 경도 등 위치 정보를 담은 데이터를 저장할 때 사용하는 타입이다. 

PUT drama_search/_mapping
{
  "title": "Happy New Year",
  "Location": {
    "lat" : 50.4215435,
    "lon" : -1.4324234
  }
}

 

 

9) IP

IP주소와 같은 데이터를 저장하는 타입으로 IPv4, IPv6 모두 지정할 수 있다.

 

 

10) Object

JSON 포맷의 문서는 내부 객체를 계층적으로 포함할 수 있다. 문서의 필드는 단순히 값을 가질 수도 있지만 복잡한 형태의 또 다른 문서를 포함하는 것도 가능하다.

PUT drama_saerch/_doc/5
{
  "title": "Happy New Year",
  "companies": {
    "companyName": "war"
  }
}

 

 

11) Nested

Object 객체 배열을 독립적으로 색인하고 질의하는 형태의 데이터 타입이다. 

 

companyCd: 1
companyNm: "제목1"

companyCd: 2
companyNm: "제목2"

 

데이터가 배열 형태로 저장되면 한 필드 내의 검색은 기본적으로 OR 조건으로 검색된다. 예를 들어, 위와 같은 데이터가 있을 때 companyCd 가 1이고, compayNm 이 "제목2" 로 검색했다면 검색이 안되길 바라지만 두 개가 모두 나온다.

 

위 문제를 해결하기 위해서 생긴 게 바로 Nested 데이터 타입이다. 

반응형