본문 바로가기
공부

Elasticsearch) Mapping

by son_i 2023. 12. 8.
728x90

ES는 인덱스에 도큐먼트를 추가하면 자동으로 매핑이 생성됨.

 

집어넣은 데이터의 도큐먼트 모양에 따라 다양한 매핑들이 생성.

Mapping은 RDB의 스키마(속성)라고 생각.

 

GET [인덱스명]             //setting, mapping정보 다 볼 수 있음.

GET [인덱스명]/_mapping // mapping 정보만 확인 가능.

 

매핑 정의

데이터가 입력되어 자동으로 매핑 생성되기 전에 미리 먼저 인덱스의 매핑을 정의해놓으면 정의 해놓은 매핑에 맞추어 데이터가 입력됨.

PUT <인덱스명>
{
  "mappings": {
    "properties": {
      "<필드명>":{
        "type": "<필드 타입>"
        … <필드 설정>
      }
      …
    }
  }
}

 

 

이미 만들어진 매핑에 필드 추가는 가능

PUT <인덱스명>/_mapping
{
  "properties": {
    "<추가할 필드명>": { 
      "type": "<필드 타입>"
      … <필드 설정>
    }
  }
}

 

단, 이미 만들어진 필드 삭제하거나 필드의 타입, 설정값 변경은 불가능.

필드의 변경이 필요한 경우 인덱스를 새로 정의하고 기존 인덱스의 값을 새 인덱스에 재색인 해야함.

 

book 인덱스를 확인해보면 title필드는 text로 이루어져있고 하위에  keyword라는 필드가 있음

text는 데이터를 역인덱스해서 저장하고 keyword는 입력된 문자열을 하나의 토큰으로 저장함.

"title": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        }

 

따라서 title.keyword로 검색할 때는 통으로 된 문자열(Romeo and Juliet)이 아니면 검색이 안 됨. 대소문자 하나만 달라도 검색이 안 됨.

keyword필드는 aggregation같은 데에서 집계를 할 때 필요

그냥 title로 검색할 때는 Romeo든 Juliet이든 다 가능 !

GET books/_search
{
  "query": {
    "match": {
      "title.keyword": "Juliet"
    }
  }
}

 

방금 위에 text 필드 말고 keyword 필드까지 넣어준 것은 멀티필드

아래처럼 사용가능. 

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

 

 

 

참조 

모든 내용은 아래 가이드 북에서 참고해 정리했습니다.

큰 도움 받았습니다. . . . 

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

 

7.2 매핑 - Mappings - Elastic 가이드북

인덱스의 매핑에서 필드들은 mappings 아래 properties 항목의 아래에 지정됩니다. 위 예제에서 보면 데이터 형식에 맞게 title, author, category 필드들은 text와 keyword타입으로, pages 필드는 long 타입으로, p

esbook.kimjmin.net