본문으로 바로가기

Elasticsearch Index mapping type 종류 및 차이점

category ELK 2022. 9. 13. 18:35
반응형

 

 

Elasitcsearch 로컬 실행

 

2022.07.12 - [docker] - Docker + Elasticsearch, Kibana 구성 (single node)

 

Docker + Elasticsearch, Kibana 구성 (single node)

elasticsesarch, kibana 이미지 다운 및 컨테이너 실행 # elasticsearch 7.8.1 이미지 다운로드 docker pull docker.elastic.co/elasticsearch/elasticsearch:7.8.1 # elasticsearch 컨테이너 실행 # -d : detach..

1995-dev.tistory.com

 

type

1. 종류

종류 설명
text 문자열, 전문 텍스트(full text) 검색용 (역색인 구조)
keyword 문자열, 형태소 분석을 하지 않음
byte, short, integer, long 정수
float, double, half_float, scaled_float 실수
data 날짜
boolean true, false
list 리스트 각 데이터 타입은 동일해야함
object 한 필드 안에 하위 필드를 가질수 있음
필드 내부에 있는 값 들을 모두 하나의 도큐먼트로 취급
nested 한 필드 안에 하위 필드를 가질수 있음
필드 내부에 있는 값 들을 모두 별개의 도큐먼트로 취급

 

2. 비교

2-1 text vs keyword

  • text : 전문 텍스트(full text) 검색용 (역 색인 구조)
  • keyword : 형태소 분석을 하지 않음

 

text

PUT product-text
{
	"mappings": {
		"properties": {
			"name": {
				"type": "text"
			}
		}
	}
}

POST product-text/_doc
{
	"name": "samsung laptop"
}

GET product-text/_search
{
	"query": {
		"match": {
			"name": "laptop"
		}
	}
}

데이터 있음

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.2876821,
    "hits" : [
      {
        "_index" : "product-text",
        "_type" : "_doc",
        "_id" : "k5lCNoMBEcCPHPUCzBjv",
        "_score" : 0.2876821,
        "_source" : {
          "name" : "samsung laptop"
        }
      }
    ]
  }
}

 

keyword

PUT product-keyword
{
	"mappings": {
		"properties": {
			"name": {
				"type": "keyword"
			}
		}
	}
}

POST product-keyword/_doc/1
{
	"name": "samsung laptop"
}

GET product-keyword/_search
{
	"query": {
		"match": {
			"name": "laptop"
		}
	}
}

데이터 없음

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 0,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  }
}

 

 

2-2 object vs netsted

  • object : 필드 내부에 있는 값 들을 하나의 도큐먼트로 취급
  • netsted : 필드 내부에 있는 값 들을 모두 별개의 도큐먼트로 취급

 

object

PUT product-object
{
  "mappings": {
    "properties": {
      "detail": {
        "properties": {
          "gift": {
            "type": "text"
          },
          "maker": {
            "type": "text"
          }
        }
      }
    }
  }
}

PUT product-object/_doc/1
{
  "detail": [
    {
      "gift" : "마우스패드",
      "maker": "레노버"
    },
    {
      "gift" : "키보드",
      "maker": "한성"
    }
  ]
}

PUT product-object/_doc/2
{
  "detail": [
    {
      "gift" : "헤드셋",
      "maker": "삼성"
    },
    {
      "gift" : "마우스패드",
      "maker": "한성"
    }
  ]
}


GET product-object/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "detail.gift": "마우스패드"
          }
        },
        {
          "match": {
            "detail.maker": "한성"
          }
        }
      ]
    }
  }
}

결과 2개

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 0.36464313,
    "hits" : [
      {
        "_index" : "product-object",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.36464313,
        "_source" : {
          "detail" : [
            {
              "gift" : "마우스패드",
              "maker" : "레노버"
            },
            {
              "gift" : "키보드",
              "maker" : "한성"
            }
          ]
        }
      },
      {
        "_index" : "product-object",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 0.36464313,
        "_source" : {
          "detail" : [
            {
              "gift" : "헤드셋",
              "maker" : "삼성"
            },
            {
              "gift" : "마우스패드",
              "maker" : "한성"
            }
          ]
        }
      }
    ]
  }
}

 

netsted

PUT product-nested
{
  "mappings": {
    "properties": {
      "detail": {
        "type": "nested",
        "properties": {
          "gift": {
            "type": "text"
          },
          "maker": {
            "type": "text"
          }
        }
      }
    }
  }
}


PUT product-nested/_doc/1
{
  "detail": [
    {
      "gift" : "마우스패드",
      "maker": "레노버"
    },
    {
      "gift" : "키보드",
      "maker": "한성"
    }
  ]
}

PUT product-nested/_doc/2
{
  "detail": [
    {
      "gift" : "헤드셋",
      "maker": "삼성"
    },
    {
      "gift" : "마우스패드",
      "maker": "한성"
    }
  ]
}

GET product-nested/_search
{
  "query": {
    "nested": {
      "path": "detail",
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "detail.gift": "마우스패드"
              }
            },
            {
              "match": {
                "detail.maker": "한성"
              }
            }
          ]
        }
      }
    }
  }
}

결과 1개

{
  "took" : 4,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.3862942,
    "hits" : [
      {
        "_index" : "product-nested",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 1.3862942,
        "_source" : {
          "detail" : [
            {
              "gift" : "헤드셋",
              "maker" : "삼성"
            },
            {
              "gift" : "마우스패드",
              "maker" : "한성"
            }
          ]
        }
      }
    ]
  }
}
반응형