본문 바로가기
TIL/엘라스틱 서치

Elastic Search : Complete Guide to ElasticSearch - 매핑

by yeon_zoo 2024. 1. 21.

매핑 파라미터 

[Array 타입]

  • array 타입 같은 건 없다.
    • 기본적으로 엘라스틱서치에서는 어떤 필드라도 0개 이상의 값을 가질 수 있기 때문
    • 따라서 array 타입이라고 지정하지 않아도 array 로 저장 가능
  • 내부 구현
    • 텍스트 필드인 경우, 토큰화 하고 역인덱스로 저장하게 된다.
    • [“Strings are simply”, “merged together”] 은 사실 각 단어 단위로 저장된 하나의 문장처럼 저장되는 것과 같다
      특징
    • 모든 array 내부에는 같은 데이터형이 사용되어야 한다. (단 강제 변환-coercion이 가능한 경우는 가능) 
      ex) true, false, “true” -> 가능
  • 다이나믹 매핑을 이용하는 경우는 강제 변환도 안됨.
  • 형 변환에 의존하지 말자. (같은 형으로 저장하자..)

[Nested arrays]

  • 배열 안의 배열도 가능하다. -> [1, [2, 3]]
  • 이 경우 flatten 된 형태로 저장된다. -> [1, 2, 3]
  • 독립적으로 Object를 쿼리해야 한다면 array에 대해서는 nested 데이터형을 사용해야 한다.

[매핑을 추가하는 방법]

PUT /reviews
{
  "mappings": {
    "properties": {
      "rating": {"type": "float"},
      "content": {"type": "text"},
      "product_id": {"type": "integer"},
      "author": {
        "properties": {
          "first_name": {"type": "text"},
          "last_name": {"type": "text"},
          "email": {"type": "keyword"}
        }
      }
    }
  }
}

 

  • 정해진 네이밍 컨벤션은 따로 없다. 캐멀& 스네이크, 암거나 써라
  • object를 매핑할 때 . 을 이용해서 좀 더 편하게 할 수 있다.
    • properties 대신 “author.first_name” : {“type”: “text”}

[매핑 검색]

GET /reviews/_mapping/ -- 전체 매핑 조회
GET /reviews/_mapping/field/content -- 특정 필드 매핑 조회
GET /reviews/_mapping/field/author.email -- object 타입 내 특정 필드 매핑 조회


[이미 존재하는 인덱스에 필드 추가하기]

PUT /reviews/_mapping
{
  "properties": {
    "created_at": {
      "type": "date"
    }
  }
}


[date 필드]

  • 데이트 필드가 표현되는 세가지 방식
  • 특별히 포맷된 문자열 형식
    • 유닉스 시간 - epoch부터의 ms (Long)
    • 유닉스 시간 - epoch부터의 초 (int)
    • epoch = 1970년 1월 1일을 의미
  • es가 지원하는 date 필드 포맷
    • 시간 없이 날짜만
    • 시간 포함 날짜 - 특정하지 않으면 타임존 UTC 시간으로 인식
    • epoch로부터의 ms
  • 날짜는 ISO 8601에 맞춰 포맷되어야 한다.
  • 저장 시에는 유닉스 타임으로 저장된다.
  • 타임존과 함께 저장한다면 저장할 땐 UTC 기준으로 저장한다.
    • UTC 기준 시간이라면 “2015-01-29T11:23:41Z”
    • 그 외 타임존이라면 “2015-01-29T11:23:41+01:00"
  • Date 타입을 인덱싱할 때, 날짜형, 날짜+시간형, 유닉스 타임형을 다 섞어 써도 괜찮지만 유닉스 타임형 * 1000을 해줘야 한다는 걸 까먹으면.. 제대로 검색 안 된다.
  • 필드 값이 없는 문서
  • 엘라스틱 서치에서는 모든 필드가 optional 이다 (!= 관계형 DB)
  • 쿼리할 때 해당 필드가 없는 문서는 제외하고 검색한다.

[매핑 파라미터]

  • format
    • date 필드를 커스텀할 때 사용 (하지만 커스텀하지 않기를 추천. 차라리 Logstash 같은 걸로 가공을 해라)
  • properties
    • object 타입을 매핑할 때 사용
  • coerce
    • 강제 형변환을 활성화 / 비활성화 하는데 사용 (기본값 = 활성)
    • 필드마다 비활성화 할 수도 있고, 전체 인덱스에 대해서 비활성화할 수도 있다.
    • 전체 인덱스에서 비활성화하고 특정 필드만 활성화하는 것도 가능
PUT /sales
{
  "settings": {
    "index.mapping.coerce": false // 전체 필드 coerce 비활성화
  },
  "mappings": {
    ...
  }
}
  • doc_values
    • 루씬에서 사용하는 또 다른 자료구조
    • 다른 데이터 접근 패턴에 대해서 최적화되어 있다. (document -> terms)
    • 집계를 하고 싶거나 정렬을 하고 싶을 때 사용
    • 정렬, 집계, 혹은 scripting 에 사용된다.
    • 역인덱스의 대체가 아니라 추가적으로 사용되는 자료구조이다.
    • 저장 공간 확보를 위해 doc_values를 false 로 설정할 수도 있다. (여러 데이터 구조로 저장하는 건 데이터 저장이 중복된다는 것이니까)
      • 인덱싱 처리량도 살짝.. 올라간다
      • 정렬 집게 같은 걸 안 한다면 false로 설정하라.
    • 근데 이 값을 바꾸려면 새 인덱스로 모든 도큐먼트를 옮겨야 한다.
      • 주로 어떤 쿼리를 하는지 분석을 해봐야 한다.
  • norms
    • 관계도 점수를 계산할 때 사용하는 여러 표준화 요인의 저장소를 말한다.
    • 쿼리 시에 그냥 필터만 하는 게 아니라 (쿼리에 대해서 얼마나 잘 맞았는지) 순위를 매기고 싶을 때가 있다.
    • Norms는 저장 공간을 많이 먹기 때문에 삭제하고 싶을 수 있다.
    • 근데 삭제하면 이제 관계도 점수 측정 불가
    • 필터링이나 집계는 그대로 가능
  • index
    • 필드 자체를 인덱싱 하지 않겠다는 옵션
    • 해당 필드에 대해서 검색 쿼리가 불가능해진다
    • 저장 공간 확보 + 인덱싱 처리량 상승
    • 시계열 데이터(필터링에서는 사용하지 않고 집계 정도로만 사용하는 필드)에서 종종 사용된다 -> 집계는 가능
  • null_value
    • 엘라스틱 서치에서는 Null은 저장되지 않고 따라서 검색되지도 않는다.
    • 이 옵션을 활성화하면 null 값을 다른 값으로 대체해준다.
    • 빈 array같은 값에는 값 대체가 안 통한다.
    • 대체하는 값은 정의된 필드의 값과 동일해야 한다.
    • _source 에는 영향을 미치지 않아서 처음 들어온 값 그대로 노출되게 된다.
  • copy_to
    • 두 개 이상의 필드를 동시에 인덱싱하고 싶은 경우 사용 -> 값 복사
      예 ) first_name + last_name -> full_name
    • 각 필드의 값이 복사된다 (term이나 토큰 복사가 아님)
    • 대상 필드의 분석기가 복사된 값을 분석
    • 복사된 필드는 _source에 포함되지 않음.

댓글