엘라스틱서치(Elasticsearch)를 처음 공부하면서 알아야 할 기본 개념들을 정리했다. 왜 쓰는지부터 핵심 용어, RDB와의 차이, 기본 REST API 사용법까지 다룬다.
Elasticsearch는 대량의 데이터를 빠르게 검색하고 분석하기 위해 만들어진 분산 검색 엔진이다. Apache Lucene이라는 검색 라이브러리를 기반으로 만들어졌고, JSON 형태의 문서를 저장하고 검색할 수 있는 NoSQL 데이터 저장소 역할도 겸한다.
일반적인 관계형 데이터베이스(MySQL, PostgreSQL 등)의 LIKE '%검색어%' 방식은 데이터가 많아질수록 느려지고, 오타나 유사어 검색, 관련도 순 정렬 같은 기능을 구현하기 어렵다.
기존에 관계형 데이터베이스를 다뤄봤다면, 아래 대응 관계로 이해하면 감이 빨리 잡힌다.
| RDB (MySQL 등) | Elasticsearch | 의미 |
|---|---|---|
| Database | Index | 데이터가 모이는 큰 단위 |
| Table | Type (7.x 이후 사실상 폐지, Index가 그 역할까지 겸함) | 데이터의 종류 |
| Row | Document | 데이터 한 건, JSON 형태 |
| Column | Field | 문서 안의 속성 하나 |
| Schema | Mapping | 필드별 데이터 타입 정의 |
| SQL | Query DSL (JSON 기반 쿼리) | 데이터를 조회하는 방법 |
💡 완전히 1:1로 대응되는 건 아니지만, RDB 경험이 있다면 이 표만 봐도 절반은 이해한 셈이다. 가장 큰 차이는 Elasticsearch는 관계(JOIN)를 지원하지 않는다는 점이다. 대신 검색과 텍스트 분석에 완전히 최적화되어 있다.
Elasticsearch가 빠른 이유의 핵심은 역인덱스 구조에 있다.
일반적인 책의 색인(찾아보기)을 떠올리면 이해가 쉽다. 책 내용을 처음부터 끝까지 훑는 대신, 뒤에 있는 "찾아보기" 페이지에서 단어를 찾아 바로 몇 페이지에 있는지 알 수 있는 것과 같은 원리다.
문서 1: "빠른 갈색 여우가 뛴다"
문서 2: "느린 갈색 개가 걷는다"
이 문서들을 단어 단위로 쪼개서 인덱스를 만들면 이런 구조가 된다.
"갈색" → [문서1, 문서2]
"빠른" → [문서1]
"느린" → [문서2]
"여우" → [문서1]
"개" → [문서2]
"갈색"을 검색하면 문서 전체를 뒤지지 않고, 이 색인표에서 바로 [문서1, 문서2]를 찾아낸다. 이게 바로 역인덱스이고, Elasticsearch 검색 속도의 핵심 원리다.
가장 간단한 방법은 Docker로 실행하는 것이다.
docker run -d --name elasticsearch \
-p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e "xpack.security.enabled=false" \
docker.elastic.co/elasticsearch/elasticsearch:8.15.0
실행 후 브라우저나 curl로 http://localhost:9200에 접속하면 버전 정보가 JSON으로 응답된다.
Elasticsearch는 모든 조작을 HTTP + JSON으로 한다. RDB처럼 별도의 쿼리 언어를 배우기 전에, 우선 REST API 감각부터 익히는 게 좋다.
인덱스(데이터베이스 격) 생성
curl -X PUT "localhost:9200/products"
문서 추가
curl -X POST "localhost:9200/products/_doc/1" \
-H "Content-Type: application/json" \
-d '{
"name": "무선 이어폰",
"price": 89000,
"category": "전자기기"
}'
문서 조회
curl -X GET "localhost:9200/products/_doc/1"
검색 (여기가 진짜 핵심)
curl -X GET "localhost:9200/products/_search" \
-H "Content-Type: application/json" \
-d '{
"query": {
"match": {
"name": "이어폰"
}
}
}'
match 쿼리는 "이어폰"이라는 단어가 포함된 문서를 찾아서, 관련도 순으로 점수(_score)와 함께 돌려준다. 이게 SQL의 LIKE와 결정적으로 다른 지점이다 — 단순 포함 여부가 아니라 얼마나 관련 있는지를 계산해서 정렬해준다.
문서 삭제
curl -X DELETE "localhost:9200/products/_doc/1"
처음 시작할 때는 아래 순서로 익히는 걸 추천한다.
match, term, bool, range 등 다양한 쿼리 종류