이전 블로그에서 가져온 글입니다. (2020.10.2)
1. 용어
RDBMS | Elasticsearch |
Database | Index |
Partition | Shard |
Table | Type |
Row | Document |
Column | Field |
2. 목적
- RDBMS
- 데이터간의 관계가 중요한 경우
... 뭔가 더 있을 거 같은데.. 지금은 생각이 안나네..
- Elasticsearch
- Fulltext 검색
- 비슷한 단어 검색
- 로그 분석
3. Fulltext
Elasticsearch(es)는 검색엔진이니깐 검색을 기준으로 정리를 해보자
es가 왜 검색엔진에 더 적합한지를 구글링해보면 Inverted Index(역색인)이라는 용어를 자주 보게 될거다.
Inverted Index를 설명하기에 앞서, 관계형 데이터베이스에서 사용되는 Index 개념부터 간단히 잡고 넘어가자면 RDBMS에서는 컬럼에다가 인덱스를 걸어 select하는데 있어 성능을 향상시킨다.
인덱스는 아래와 같은 b+tree 구조를 가지는 새로운 테이블을 하나 생성함으로서 검색하는데 성능을 올려준다.
다만 인덱스가 걸려 있지 않은 컬럼에 대해서는 Fullscan을 해버림으로 검색이 느려진다. 그렇다고 인덱스를 무분별하게 걸면 데이터베이스의 크기만 커지게 된다.
우기라 RDBMS에 데이터를 저장할 때 보통 아래와 같이 n 번째 row에 어떠한 정보가 있음을 나타내는데,
row | name |
1 | Gomip |
Inverted Index의 경우 특정 단어가 몇번째 row에 있는지 알려주는 방식으로 저장된다.
name | row |
Gomip | 1 |
3-1. Inverted Index의 성능
자 그러면 이녀석이 왜 Fulltext 검색에 좋은지를 보자
다음과 같은 문장이 있다고 가정하자
- Doc1 : The quick brown fox
- Doc2 : The quick brown fox jumps over the lazy dog
- Doc3 : brown fox brown dog
- Doc4 : Lazy jumping dog
es에서는 우선 문장들을 토큰화 함으로 공백이나 특수기호 등을 제거하고 싶은 것들을 없애는 작업을 먼저 수행한다. 검색하는데 있어 관사 the는 잘 안쓰임으로 제거하자, 대소문자도 일단 좀 넣어두자
그러면 다음과 같은 테이블이 만들어진다.
단어 | 도큐먼트 |
quick | Doc1, Doc2 |
brown | Doc1, Doc2, Doc3 |
fox | Doc1, Doc2, Doc3 |
jumps | Doc2 |
over | Doc2 |
lazy | Doc2, Doc4 |
dog | Doc2, Doc3, Doc4 |
jumping | Doc4 |
정리된 테이블을 보면 Inverted index는 책 맨 뒤에 있는 특정 단어가 무슨 페이지에 있는지 알려주는 찾아보기 페이지와 비슷한 느낌이다.
이렇게 되면 특정 단어가 어느 도큐먼트에 위치하는지 빠르게 찾아낼 수 있음으로 RDBMS보다 더 효율적으로 Fulltextsearch를 수행할 수 있다.
'[Elasticsearch]' 카테고리의 다른 글
[Elasticsearch] Springboot에서 Elasticsearch구현하기 - Document (0) | 2022.05.08 |
---|---|
[Elasticsearch] Springboot에서 ES구현하기 - Index (0) | 2022.05.08 |
[Elasticsearch] Elasticsearch란? (0) | 2022.05.08 |