(작성일: 2024.05.05)
ES (Elastic Search)
- 방대한 양의 데이터를 신속하게, 거의 실시간(NRT, Near Real Time)으로 저장, 검색, 분석할 수 있다.
- 엘라스틱서치는 검색을 위해 단독으로 사용될 수 있고
ELK(Elasticsearch/Logstash/Kibana) 스택으로 사용되기도 한다.
ELK
- Logstash
- 다양한 소스(db, csv 등)의 로그 또는 트랜잭션 데이터를 수집, 집계, 파싱하여 elasticsearch로 전달
- Elasticsearch
- logstash로부터 받은 데이터를 검색 및 집계하여 필요하거나 관심 있는 정보 획득
- Kibana
- elasticsearch의 빠른 검색을 통해 데이터를 시각화 및 모니터링

- 인덱싱 방식은 전통적인 관계형 데이터베이스에서 주로 사용된다.
인덱스를 통해 해당하는 데이터들을 조회할 수 있다.
- LIKE문 등의 검색을 할 경우, 해당 데이터에 검색어가 포함되어 있는지 일일히 비교하여
해당하는 데이터들을 반환하는 방식이기에 시간이 오래 소요되고 비효율적이다.
- 하지만 역인덱싱 방식의 경우 검색 시 검색어가 포함되어 있는 데이터들을 이미 저장 단계에서부터
알고 있기 때문에 한 번의 검색 만으로 해당하는 데이터를 반환하기에 검색에 특화되어 있다.
역색인
- 일반적인 색인의 목적은 '문서의 위치'에 대한 index를 만들어서 빠르게 그 문서에 접근하고자 하는 것이다.
- 반면 역색인은 '문서 내의 문자와 같은 내용물'의 매핑 정보를 색인해 놓는 것이다.
- ex.)
- 일반 색인 (forward index)
- 책의 목차와 같은 의미
- 역색인 (inverted index)
- 책 가장 뒤의 단어 별 색인 페이지
- ex.)
- DB에서 "Trade"라는 문구가 포함된 문자열을 찾는다면 %Trade% 라고 명확히 입력해야 검색 가능
-> trade, TRADE, trAde 등의 문자열은 직접 명시하지 않는다면 찾을 수 없다.
하지만 역색인을 활용하면 대소문자 구분없이 어떤 문구가 들어와도 찾을 수 있다.
ES 특징
- Elasticsearch도 NOSQL의 일종.
- 분산 처리를 통해 실시간성으로 빠른 검색 가능
- 기존 데이터로 처리하기 힘든 대량의 비정형 데이터 검색 가능
- 전문 검색(full text)과 구조 검색 모두 지원
- 기본적으로 검색 엔진이지만 MongoDB나 Hbase와 같은 대용량 스토리지로도 활용 가능
ES 장단점
장점
- 오픈 소스 검색 엔진
- Elasticsearch를 끊임없이 개선하고 발전시키고 있다.
- 전문 검색
- 내용 전체를 색인해서 특정 단어가 포함된 문서를 검색할 수 있다.
- 기능별, 언어별 플러그인을 적용할 수 있다.
- 통계 분석
- 비정형 로그 데이터를 수집하여 통계 분석에 활용할 수 있다.
- Kibana를 연결하면 실시간으로 로그를 분석하고 시각화할 수 있다.
- Schemaless
- 정형화되지 않은 문서도 자동으로 색인하고 검색할 수 있다.
- RESTful API
- HTTP기반의 RESTful를 활용하고 요청/응답에 JSON을 사용해
개발 언어, 운영체제, 시스템에 관계없이 다양한 플랫폼에서 활용이 가능하다.
- Multi-tenancy
- 서로 상이한 인덱스일지라도 검색할 필드명만 같으면 여러 인덱스를 한번에 조회할 수 있다.
- Document-Oriented
- 여러 계층 구조의 문서로 저장이 가능하며, 계층 구조로된 문서도 한번의 쿼리로 쉽게 조회할 수 있다.
- 역색인(Inverted Index)
- 확장성
- 분산 구성이 가능하다. 분산 환경에서 데이터는 shard라는 단위로 나뉜다.
단점
- 완전한 실시간이 아니다.
- 색인된 데이터는 1초 뒤에나 검색이 가능하다.
- 내부적으로 commit과 flush같은 복잡한 과정을 거치기 때문.
- Transaction Rollback을 지원하지 않는다.
- 전체적인 클러스터의 성능 향상을 위해
시스템적으로 비용 소모가 큰 롤백과 트랜잭션을 지원하지 않는다. 조심하자..
- 데이터의 업데이트를 제공하지 않는다.
- 업데이트 명령이 올 경우 기존 문서를 삭제하고 새로운 문서를 생성한다.
- 업데이트에 비해서 많은 비용이 들지만 이를 통해 불변성(Immutable)이라는 이점을 취한다.
ES 기본 용어
- Index
- 데이터 저장 공간 하나의 물리 노드에
여러 개 논리 인덱스 생성하나의 인덱스가 여러 노드에 분산 저장 (M:N)
- Shard
- 색인된 문서는 하나의 인덱스 — 인덱스 내부에 색인된 데이터는 여러개의 파티션으로 나뉘어 구성됨.
(파티션 = 샤드)
- Type
- 인덱스의 논리적 구조6.1부터 인덱스당 하나의 타입만 설정 가능
(6.0 이하에서는 music 인덱스에서 rock, pop등 장르별로 분리하는데 타입을 사용할 수 있었음)
- Document
- 데이터가 저장되는 최소 단위 JSON 포맷으로 저장 DB의 Row에 대응됨.
- Field
- 문서를 구성하기 위한 속성DB의 컬럼과 비교할 수 있음.
- 하나의 필드는 목적에 따라 다수의 데이터 타입을 가질 수 있음
- Mapping
- 문서의 필드, 필드 속성을 정의하고 그에 따른 색인 방법을 정의하는 프로세스
- 스키마 정의 프로세스라고 보면 된다.
ES 대안
MYSQL FullText Search + N gram
- 데이터가 크지 않다면 mysql FullText Search로도 충분히 검색 속도를 높일 수 있다.
(Elasticsearch는 추가적으로 인프라를 구축해야 하기 때문)
- MySQL을 사용하면 항상 데이터를 인덱싱하고 검색할 수 있다.
- Elasticsearch를 사용하면 하나의 단위로 색인화하는 데 더 많은 유연성이 있다.
- Elasticsearch가 MySQl 검색과 가장 큰 차이점은 인덱싱을 통해 많은 양의 데이터가 있을 때
ES가 더 빠르게 작동한다는 것이다. 적은 양의 데이터의 경우 차이를 느끼지 못할 것이다.
MySQL Full-Text 검색
- MySQL의 Full-Text 검색은 MySQL 데이터베이스 내에 내장된 검색 기능이다.
- 이 기능은 특정 테이블의 컬럼에서 텍스트 데이터를 검색할 때 사용할 수 있으며,
인덱스를 구축하여 검색 성능을 향상시킨다.
장점
- 별도의 검색 엔진을 설치하고 구성할 필요가 없어 구현이 간단하다.
- MySQL 환경 내에서 모든 작업이 이루어지므로, 별도의 시스템 간 동기화가 필요 없다.
- SQL 쿼리를 사용하여 검색을 수행할 수 있으며, 검색 조건을 SQL 문법으로 표현할 수 있다.
단점
- 검색 기능이 비교적 기본적이며,
Elasticsearch와 같은 전문 검색 엔진에 비해 검색 옵션이 제한적이다.
- 대규모 데이터셋에 대한 검색 성능이 Elasticsearch보다 떨어질 수 있다.
- 텍스트 분석 기능(예: 자동 언어 감지, 동의어 처리)이 제한적이다.
사용 사례
- 간단한 텍스트 검색 요구 사항을 가진 소규모에서 중규모 애플리케이션
- 검색 기능이 애플리케이션의 주 기능이 아닌 경우.
Full-Text 인덱스 생성
- Full-Text 인덱스는 CREATE TABLE 문이나 ALTER TABLE 문을 사용하여
테이블의 특정 TEXT, CHAR, 또는 VARCHAR 타입 컬럼에 대해 생성할 수 있다.
- 예를 들어, posts 테이블의 title과 content 컬럼에 Full-Text 인덱스를 생성하는 방법
CREATE TABLE posts ( id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(255), content TEXT, FULLTEXT(title, content));-- 또는 기존 테이블에 인덱스 추가ALTER TABLE posts ADD FULLTEXT(title, content);
Full-Text 검색 수행
- Full-Text 인덱스가 생성되면, MATCH() ... AGAINST() 구문을 사용하여
해당 컬럼에서 텍스트를 검색할 수 있다.
- AGAINST 함수에 검색하려는 단어나 구문을 지정한다.
SELECT * FROM postsWHERE MATCH(title, content) AGAINST('검색어');
검색 모드
- MariaDB의 Full-Text 검색은 두 가지 모드를 지원한다.
- 자연어 모드(Natural Language Mode)와 불리언 모드(Boolean Mode).
- 위의 예시는 자연어 모드 검색을 사용한 것이며,
불리언 모드 검색은 더 복잡한 검색 쿼리를 작성할 수 있게 해준다.
-- 불리언 모드 검색 예시SELECT * FROM postsWHERE MATCH(title, content) AGAINST('+MySQL -Oracle' IN BOOLEAN MODE);
참고
[Elastic Search] 기본 개념과 특징(장단점)
엘라스틱서치의 기본 개념, 특징에 대해 정리
jaemunbro.medium.com
https://aws.amazon.com/ko/what-is/elasticsearch/
Elasticsearch란 무엇인가요? - Elasticsearch 엔진 설명 - AWS
Elasticsearch는 Apache Lucene에 구축되어 배포된 검색 및 분석 엔진입니다. 2010년에 릴리스되기 시작한 이후로 Elasticsearch는 빠르게 인기 검색 엔진이 되었으며 로그 분석, 전체 텍스트 검색, 보안 인텔
aws.amazon.com
https://victorydntmd.tistory.com/308
[Elasticsearch] 기본 개념잡기
1. Elasticsearch란?Elasticsearch는 Apache Lucene( 아파치 루씬 ) 기반의 Java 오픈소스 분산 검색 엔진입니다.Elasticsearch를 통해 루씬 라이브러리를 단독으로 사용할 수 있게 되었으며, 방대한 양의 데이터를
victorydntmd.tistory.com
https://dealicious-inc.github.io/2021/11/22/dealibird-elastic-search.html
엘라스틱서치 그게 뭔데 그거 어떻게 하는 건데
딜리버드 검색 Elasticsearch 적용기
dealicious-inc.github.io
https://tecoble.techcourse.co.kr/post/2021-10-19-elasticsearch/
Spring Data Elasticsearch 설정 및 검색 기능 구현
실습 Repository에서 코드를 확인할 수 있습니다. 1. Elasticsearch Elasticsearch는 Apache Lucene 기반의 Java 오픈소스 분산형 RESTful…
tecoble.techcourse.co.kr
https://annajin.tistory.com/218
[TIL] 07/25 항해99 78일차 - MySQL 검색기능 : FullText Search
들어가며 프로젝트에 음식점 검색 기능을 구현해야했다. 초반에는 Elasticsearch를 이용해서 구현을 해보려고 목표를 잡아두었었는데, Elasticsearch의 러닝커브가 높고 리소스도 많이 드는 기술이기
annajin.tistory.com
'SpringBoot' 카테고리의 다른 글
[ELK] ELK + SpringBoot MSA (ELK 3) (0) | 2025.05.25 |
---|---|
[ELK] ELK 설치 및 구축 방법 (ELK 2) (0) | 2025.05.25 |
[SpringBoot] JPQL Query Methods (0) | 2025.05.20 |