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.
영어가 어려운 내용은 아니어서 해석 할 수 있을거라 생각하고 넘어간다.
그래서 Elasticsearch에 Index를 생성할때 Type을 지정하고 Index를 생성해봤자 JAVA에서 Elasticsearch를 사용할 수 있는 High Level rest api 를 이용했을 때 Type을 지정해서 명령을 내리면 에러가 발생하기 때문에 인덱스를 생성할때 mapping은 지정하되 Type은 삭제하고 생성해야 한다.
'ELK' 카테고리의 다른 글
Elasticsearch를 이용한 문서 유사도 검색과 Springboot를 통한 구현 (1) (0) | 2020.09.05 |
---|---|
logstash deactivating (stop-sigterm) 해결방법 (0) | 2020.09.04 |
elasticsearch java high level rest client에서 analyze 사용 (0) | 2020.08.05 |
Elasticsearch spring REST Client unrecognized parameter 오류 (0) | 2020.07.22 |
MySql에서 ElasticSearch 데이터 이동(systemd 이용) (0) | 2020.07.15 |