꿀똥벌레
꿀똥벌레 개발 블로그
꿀똥벌레
전체 방문자
오늘
어제
  • 분류 전체보기 (90)
    • JAVA (17)
    • SPRING (14)
    • Elasticsearch (4)
    • GRADLE (2)
    • HTML, CSS (0)
    • JAVASCRIPT (0)
    • GIT (1)
    • Vue.js (1)
    • server (1)
    • Python (0)
    • IT리뷰 (0)
    • 인프라 (6)
    • IOS (21)
    • 디자인패턴 (20)
    • Kafka (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • persistence connection
  • java
  • springintegration
  • KEEPALIVE
  • maxConnPerRoute
  • Index Template
  • SWIFT
  • ES
  • 스프링 인티그레이션
  • Index
  • mappings
  • spring integration
  • elasticsearch
  • 인덱스 템플릿
  • connectionRequestTimeout
  • spring
  • persistent connection
  • 스프링 인테그레이션
  • 엘라스틱서치
  • maxConnTotal

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
꿀똥벌레

꿀똥벌레 개발 블로그

Elasticsearch

엘라스틱서치 인덱스 Mapping 과 Properties 정리

2023. 11. 14. 09:35

엘라스틱서치에서 인덱스는 RDB의 테이블과 비슷한 역할을 한다. 또한 엘라스틱서치는 기본적으로 스키마리스이나, 실제 운용하는데 있어서는 mapping을 통해 스키마를 정의 하여 사용한다. 인덱스 추가 및 스키마 정의를 위해 인덱스 API 및 매핑API 를 사용 한다.

인덱스 추가

PUT /movie
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 2
  },
  "mappings": {
    "properties": {
      "movieCd": {"type": "integer"},
      "movieNm": {"type": "text"},
      "movieNmEn": {"type": "text"},
      "prdtYear": {"type": "integer"},
      "openDt": {"type": "date"},
      "typeNm": {"type": "keyword"},
      "prdtStatNm": {"type": "keyword"},
      "nationAlt": {"type": "keyword"},
      "genreAlt": {"type": "keyword"},
      "repNationNm": {"type": "keyword"},
      "repGenreNm": {"type": "keyword"}
    }
  }
}

 

Mapping 모듈

매핑은 도큐먼트가 어떻게 저장되고, 어떤 필드들이 인덱싱 되는 지 인덱스를 추가할 때 mappings (mapping module)를 이용해 매핑 유형에 대해 정의한다. 각 필드들은 콜렉션으로, 별도 세팅 없이 여러 개를 가질 수 있다.

인덱스 생성 시 매핑 적용

인덱스 생성 시에 매핑을 적용할 수 있다.

PUT /my-index
{
    "mappings": {
        "properties": {
            "age": {"type": "integer"},
            "email": {"type": "keyword"},
            "name": {"type": "text"}
        }
    }
}

 

기존 인덱스에 매핑 추가

PUT my-index/_mapping
{
    "properties": {
        "phoneNumber": {
            "type": "keyword",
            "index": false
        }
    }
}

필드 매핑 수정

mapping parameter를 제외 하고 기존 필드에 대한 매핑을 수정할 수는 없다. 기존 필드를 수정 하려는 경우 reindex등 다른 방법을 고려해야 한다.

매핑 정보 조회

GET /my-index/_mapping
//email 필드만 조회
GET /my-index/_mapping/field/email

매핑 프로퍼티(파라미터)

매핑 프로퍼티는 mappings.properties에 들어갈 항목으로, 도큐먼트가 어떻게 저장되는지에 대해 다룬다. 데이터 타입을 정의할 수 있고, 텍스트인 경우 저장 시 어떤 분석기를 사용하는지 등을 정의할 수 있다.

PUT my-index
{
    "settings": {...},
    "mappings": {
        "properties": {
            "title": {
                "type": "text",
                "analyzer": "standard",
                "search_analyzer": "my_analyzer",
                "search_quote_analyzer": "my_analyzer"
            }
        }
    }
}

type: (string, 타입) 해당 필드의 타입을 정의한다.

analyzer: (string, 분석기명) 인덱싱 시 사용하는 분석기 이다.

search_analyzer: (string, 분석기명) 검색시 사용하는 분석기 이다. 설정하지 않으면 analyzer를 사용한다.

search_quote_analyzer: (string, 분석기명) 인용부호로 묶인 구문을 분석할 때 사용하는 분석기 이다.

coerce: (boolean) coerce가 적용되는 경우 필드의 타입에 맞는 데이터가 강제된다. 타입에 맞지 않는 경우 인덱싱에 실패한다.

copy_to: (string,  필드명) 인덱싱 될 때 해당 필드로 값이 복사되어 인덱싱 된다.

PUT my-index
{
  "mappings": {
    "properties": {
      "first_name": {
        "type": "text",
        "copy_to": "full_name" 
      },
      "last_name": {
        "type": "text",
        "copy_to": "full_name" 
      },
      "full_name": {
        "type": "text"
      }
    }
  }
}

위와 같이 인덱싱 하는 경우, full_name에 쿼리를 통해 first_name, last_name 두 필드 모두에게 쿼리하는 효과를 낼 수 있다.

doc_values: (boolean, default true) doc_values는 인덱싱 시 on-disk data structure로 저장 된다. _source에 저장되는 데이터와 동일한 데이터를 저장 하지만, aggregation이나 sorting에 더 효율적인 열 중심 데이터 구조로 저장 된다. 따라서 aggregation, sorting 시 더 효율적으로 사용될 수 있다.

PUT my-index-000001
{
  "mappings": {
    "properties": {
      "user_name": { 
        "type":  "long"
      },
      "user_name_doc_value": { 
        "type":  "long",
        "index": false
      }
    }
  }
}

user_name필드는 long필드로 _source와 doc_values를 둘 다 갖는다. user_name_doc_value 필드는 index: false를 통해 doc_value 값만을 저장 한다.

dynamic: (boolean) 매핑에 지정되지 않은 필드에 동적으로 데이터를 인덱싱 할 수 있는지 여부 값이다. 기본적으로 dynamic 프로퍼티는 부모 속성을 상속 받는다. 여러 필드를 갖는 필드인 경우, 동적으로 필드를 받고 싶을 때 사용한다.

PUT my-index
{
  "mappings": {
    "dynamic": false, 
    "properties": {
      "user": { 
        "properties": {
          "name": {
            "type": "text"
          },
          "social_networks": {
            "dynamic": true, 
            "properties": {}
          }
        }
      }
    }
  }
}

social_networks 필드는 동적으로 필드를 받을 수 있다.

eager_global_ordinals: (boolean) 인덱싱 되는 시점에 필드에 대한 global ordinal을 미리 설정 해두는지 여부 값이다.

더보기

global ordinal??

엘라스틱 서치는 성능 향상을 위해 인덱싱 시점에 각 텀마다 ordinal을 지정하고, bucket 어그리게이션 등에서 ordinal로만 그룹화 한 후, 이후에 실제 term을 가지고 온다. ordinal은 각 샤드마다 고유하고, 모든 샤드를 통틀어서 정해진 ordinal을 global ordinal 이라고 한다.

eager_global_ordinals 속성을 true로 하면, 검색 시점에는 ordinal 계산이 필요 없기 때문에 성능 향상이 되지만, 인덱싱 시점에e는 각 데이터 인덱싱 및 데이터 변경마다 ordinal계산이 필요하므로 성능이 저하된다.

enabled: (boolean) 인덱싱 처리 여부에 대한 설정이다. false처리 하는 경우 인덱싱 처리 되지 않아 검색에 사용할 순 없으나, 해당 데이터 조회시 _source 필드에 출력은 된다.

format: (string) 날짜에 대한 포맷 설정이다.

ignore_above: (integer) 해당 설정보다 길이가 긴 스트링은 저장이 되지 않는다. 스트링 array 인 경우, 각각 스트링마다 해당 validation이 적용 된다.

ignore_malformed: (boolean) 기본적으로 엘라스틱서치는 올바르지 않은 데이터가 인덱싱 될 경우 excpetion이 발생하고, 해당 도큐먼트는 인덱싱 되지 않는다. 해당 설정을 true로 할 경우, 해당 필드만 무시된 채로 도큐먼트는 정상적으로 인덱싱 된다.

index: (boolean) 인덱싱 처리 여부를 설정한다. false로 지정 되면 인덱싱 처리가 되지 않는다.

fields: 한개의 필드 데이터에 대해 여러 매핑 정보를 적용시키고 싶을 때 사용한다. 

PUT my-index
{
  "mappings": {
    "properties": {
      "name": { 
        "type": "text",
        "fields": {
          "english": { 
            "type": "text",
            "analyzer": "english"
          },
          "raw": {
            "type": "keyword"
          }
        }
      }
    }
  }
}
  • name 필드는 텍스트 타입으로, standard 분석기로 인덱싱 된다.
  • name.english 필드는 텍스트 타입으로, english 분석기로 인덱싱 된다.
  • name.raw는 keyword 타입으로 인덱싱 된다.

normalizer: (string) 노멀라이저를 설정한다. keyword필드에 설정할 수 있다. text필드의 분석기와 비슷하나, 토큰화처리를 하지 않는다.

norms: (boolean) 엘라스틱 서치 도큐먼트는 기본적으로 스코어링 처리를 위해 필드 하나당 1바이트 정도를 사용한다. 스코어링이 필요없는 경우 norms: false를 주어 불필요한 용량을 사용하지 않도록 할 수 있다.

null_value: (string) null값인 경우 인덱싱 될 값을 설정한다.

position_increment_gap: (integer) 다중값(배열) 로 데이터를 인덱싱 할때, 각 배열 엘리먼트 간 갭 차이를 설정한다. 예를들어 해당 속성 값이 100 일 경우 ["john abraham", "lincoln smith"] 를 인덱싱 하면

  • john: positon 1
  • abraham: position 2
  • lincoln: position 103
  • smith: position 104

식이다. 갭 차이가 충분히 크지 않다면, "abraham lincoln" 과 같이 다른 엘리먼트에 포함된 검색에도 결과가 도출될 수 있다.

properties: 하위 오브젝트 프로퍼티를 선언할 때 사용한다.

term_vector: 텀벡터는 분석기에 의해 텍스트가 분석되었을 때 가지는 정보이다. 텀 리스트, 각 텀들의 위치 정보, 텀의 시작과 위치 정보(offset) 등을 가진다.  

  • no: 텀벡터를 수집하지 않는다.
  • yes: 텀정보 만을 저장한다.
  • with_positions: 텀 정보와 포지션 정보를 수집한다.
  • with_offsets: 텀 정보와 오프셋 정보를 수집한다.
  • with_positions_offsets: 텀, 포지션, 오프셋을 수집한다.
  • with_positions_payloads: 텀정보, 포지션, 페이로드를 수집한다.
  • with_positions_offsets_payloads: 텀정보, 포지션, 오프셋, 페이로드를 수집한다.
저작자표시 (새창열림)

'Elasticsearch' 카테고리의 다른 글

엘라스틱서치 인덱스 Settings  (4) 2023.11.11
Elasticsearch Index Template  (0) 2023.11.07
엘라스틱 서치 노드의 종류  (0) 2023.10.30
    꿀똥벌레
    꿀똥벌레
    개발자 꿀똥벌레 입니다.

    티스토리툴바