elasticsearch에 대한 글들을 정리해보려고 하는데, 첫 게시글로 왜 elasticsearch를 사용하는지에 대해서 정리해보려고 합니다.
보통 백엔드 개발을 하다보면, elasticsearch를 처음부터 도입하진 않습니다.
처음엔 일반적으로 RDB(Relational Database)를 많이 채택하고 서비스를 개발하는데요.
서비스가 점점 커지고 검색으로 인한 부하가 커지면서 시스템이 위협?을 받게되면 검색엔진을 도입하게 되고 elasticsearch를 많이 선택하게 됩니다.
elasticsearch가 그럼 왜 검색이 빠른지 알아봐야겠죠?
elasticsearch는 엘라스틱사가 아파치 루씬을 기반으로 개발/공급하는 검색엔진 솔루션입니다.
검색이 빠른 이유는 RDB보다 index를 화려하게 사용하기 때문인데요.특히 inverted index(역색인) 구조를 활용하여, full-text search 즉 전문 검색도 빠르게 수행할 수 있습니다.
RDB에서는 index를 사용하기 위해서는 column type에 대한 제약이 있습니다.그리고 index를 걸게 되면 해당 column 값 전체가 index가 됩니다.예를 들어, 게시글의 title을 varchar(255) 형태로 선언했을 때 '엘라스틱서치기반 검색엔진 도입'과 같은 글이 있으면 index를 통해서 검색하기 위해서는 RDB에서는 아래와 같은 쿼리를 사용해야만 합니다.
select * from post
where title='엘라스틱서치기반 검색엔진 도입'
하지만 보통 사용자들이 검색하는 패턴은 절대 제목 전체를 입력해서 찾지 않고, '검색엔진'이나 '엘라스틱서치'와 같은 키워드만 입력해서 검색을 하게 되는데 그러면 RDB에서는 like 쿼리를 사용하게 됩니다. like 쿼리의 경우 모든 row에 대해서 반복문을 수행하면서 검색한 키워드가 존재하는지 확인하는 방식으로 동작하는데요. 모든 row를 탐색하고 또 키워드가 존재하는지 확인하는 동작은 계산량이 매우 많다보니 row가 많아질수록 쿼리가 느려지고 RDB의 부하가 커지는 상황이 오게 됩니다.
'엘라스틱서치기반 검색엔진 도입' -> '엘라스틱서치', '기반', '검색엔진', '도입'
'엘라스틱서치 설치방법' -> '엘라스틱서치', '설치', '방법'
그럼 이제 inverted index에 대해서 알아보겠습니다.
'엘라스틱서치기반 검색엔진 도입'이라는 문자열을 먼저 형태소 단위로 나누어보면 '엘라스틱서치', '기반', '검색엔진', '도입' 정도로 나뉘어질텐데요. 그럼 elasticsearch에서는 나뉘어진 토큰을 기반으로 해당 토큰이 어떤 문서에서 등장하는지에 대하여 map을 만들어서 가지고 있습니다.
예를 들어, (id, title) 구조에서 (0, '엘라스틱서치기반 검색엔진 도입'), (1, '엘라스틱서치 설치방법')과 같은 2개의 데이터가 있다고 가정하고 위에서 말한대로 형태소로 나누게 되면 아래와 같이 나뉠 수 있습니다.
그럼 이제 각 토큰을 기준으로 토큰이 몇 번 문서에 있었는지 map을 만들어보겠습니다.
'엘라스틱서치' - [0, 1]
'기반' - [0]
'검색엔진' - [0]
'도입' - [0]
'설치' - [1]
'방법' - [1]
모든 토큰에 대해서, 어떤 문서에서 등장했는지 id를 적어둔 map인데 위의 map을 가지고 있다면 '엘라스틱서치'라는 키워드가 검색되었을 때는 0번과 1번 두 개의 문서를 조회하고 '검색엔진'이라는 키워드가 검색되면 0번 문서만 조회하면 되는 방식입니다.
위의 map이 바로 inverted index 구조이고, elasticsearch는 inverted index 구조를 활용하기 때문에 full-text search도 빠르게 수행할 수 있습니다.
elasticsearch가 왜 필요한지, inverted index가 어떤건지, 어떻게 검색이 빠르게 수행되는지 정리해보았습니다.
다음에는 elasticsearch를 활용하는 방법에 대해서 정리해보도록 하겠습니다.
'ETC > Elasticsearch' 카테고리의 다른 글
[elasticsearch] 색인 -1 (0) | 2025.01.19 |
---|---|
[elasticsearch] 클러스터 (0) | 2024.11.10 |
[elasticsearch] 데이터 저장 (1) | 2024.10.27 |