본문 바로가기
ELK

Elasticsearch Type에 대해서

by AndoneKwon 2020. 7. 27.

Nosql에서 스키마는?

엘라스틱 서치는 만들어 질 때부터 Nosql을 지향했고 Nosql의 특징은 "기본적"으로는 Schemaless라는 것이다.

 

스키마가 고정되어있지 않아서 비정형 데이터를 처리하는데에 용이하고, 가용성이 증가하고 확장성에도 유리하다.

 

(확장성의 경우 하나의 클러스터를 여러개의 서버에 나눌 수 있도록 설계되었다.)

 

하지만 Nosql도(대표적으로 MongoDB) 데이터를 정형화해서 저장해야 하는 경우가 있기 때문에 Schema를 정해서 저장하기도 하며 이 경우에 그 정보는 어플리케이션(DB가 아닌것)이 가지고 있다.

Elasticsearch Type이란?

Elasticsearch도 기본적으로는 Nosql구조를 가지고 있기 때문에 스키마가 없지만 정형화된 틀을 만들어 줄 수 있다.

 

그것을 Type이라고 하는데 RDBMS로 따지자면 Table의 개념에 가깝다.

 

용어를 표로 정리한 자료가 네이버 D2 블로그에 잘 정리되어 있어 옮겨온다.

 

표 1 관계형 데이터베이스와 elasticsearch 용어 비교

관계형 데이터베이스 elasticsearch
Database Index
Table Type
Row Document
Column Field
Schema Mapping
Index Everything is indexed
SQL Query DSL

https://d2.naver.com/helloworld/273788

 

하지만 Elasticsearch의 버전이 7.0으로 오면서 Type의 개념을 삭제하였다.(이 부분에서 기존의 "Elasticsearch 실무가이드 책을 읽고 따라가는 사람들은 굉장히 많은 사람들이 오류를 봤을것이다.)

 

Type을 삭제한 이유는 공식 홈페이지의 문서를 참조하자면 다음과 같다.

 

Initially, we spoke about an “index” being similar to a “database” in an SQL database, and a “type” being equivalent to a “table”.

This was a bad analogy that led to incorrect assumptions. In an SQL database, tables are independent of each other. The columns in one table have no bearing on columns with the same name in another table. This is not the case for fields in a mapping type.

In an Elasticsearch index, fields that have the same name in different mapping types are backed by the same Lucene field internally. In other words, using the example above, the user_name field in the user type is stored in exactly the same field as the user_name field in the tweet type, and both user_name fields must have the same mapping (definition) in both types.

This can lead to frustration when, for example, you want deleted to be a date field in one type and a boolean field in another type in the same index.

On top of that, storing different entities that have few or no fields in common in the same index leads to sparse data and interferes with Lucene’s ability to compress documents efficiently.

For these reasons, we have decided to remove the concept of mapping types from Elasticsearch.

 

https://www.elastic.co/guide/en/elasticsearch/reference/7.0/removal-of-types.html#_why_are_mapping_types_being_removed

 

Removal of mapping types | Elasticsearch Reference [7.0] | Elastic

Indices created in Elasticsearch 7.0.0 or later no longer accept a _default_ mapping. Indices created in 6.x will continue to function as before in Elasticsearch 6.x. Types are deprecated in APIs in 7.0, with breaking changes to the index creation, put map

www.elastic.co

영어가 어려운 내용은 아니어서 해석 할 수 있을거라 생각하고 넘어간다.

 

그래서 Elasticsearch에 Index를 생성할때 Type을 지정하고 Index를 생성해봤자 JAVA에서 Elasticsearch를 사용할 수 있는 High Level rest api 를 이용했을 때 Type을 지정해서 명령을 내리면 에러가 발생하기 때문에 인덱스를 생성할때 mapping은 지정하되 Type은 삭제하고 생성해야 한다.