파이썬으로 Elasticsearch 연동하기
: 초보자를 위한 검색 엔진 데이터베이스 입문
검색 기능이 필요한 서비스, SQL만으로 충분할까요?
요즘 개발자들이 Elasticsearch에 주목하는 이유,
지금부터 함께 알아봅니다.
안녕하세요, 개발자 여러분!
이번 블로그에서는 검색 특화 데이터베이스 Elasticsearch를 파이썬으로 다루는 방법에 대해 알아보려 합니다.
요즘은 단순한 CRUD만으로는 사용자 요구를 만족시키기 어렵죠.
특히 검색이 중요한 서비스라면 성능 좋은 검색엔진 도입은 필수입니다.
Elasticsearch는 그중에서도 가장 널리 쓰이는 오픈소스 검색엔진인데요,
이번 글에서는 Elasticsearch의 기본 개념부터, 파이썬으로 연동하는 실전 예제까지!
초보자도 따라올 수 있도록 아주 천천히 설명해드릴게요. “딱 필요한 만큼, 이해될 때까지” 알려드리는 오늘의 포스팅,
지금부터 시작해볼게요!
목차
1. Elasticsearch란? 검색엔진의 개념부터 이해하기 🧠
Elasticsearch는 대규모 데이터를 실시간으로 검색하고 분석할 수 있게 도와주는 오픈소스 검색엔진입니다.
로그 분석, 문서 검색, 추천 시스템 등 다양한 분야에서 활용되며, Apache Lucene
을 기반으로 만들어졌죠.
흔히 “빅데이터 시대의 검색 엔진”이라고 불릴 만큼 인기가 많아요.
🔍 Elasticsearch는 언제 사용하나요?
- 블로그나 뉴스 콘텐츠 검색 기능 구현
- 대용량 로그 데이터 실시간 분석 (ex. ELK Stack)
- 쇼핑몰의 상품 검색 기능 최적화
- 추천 시스템 기반 검색(유사도 기반 검색 등)
📦 Elasticsearch의 기본 구조
Elasticsearch의 데이터는 Index → Type(현재는 제거됨) → Document → Field 구조로 이루어집니다.
마치 RDB의 데이터베이스 → 테이블 → 레코드 → 컬럼과 유사한 느낌이에요.
Elasticsearch | 관계형 DB(RDB) | 설명 |
---|---|---|
Index | Database | 전체 데이터를 저장하는 공간 |
Document | Row(레코드) | 하나의 데이터 객체 |
Field | Column | 각 데이터의 속성 |
🌐 NoSQL 계열의 검색 특화형 DB
Elasticsearch는 NoSQL 계열입니다.
즉, 스키마가 자유롭고, JSON 기반으로 데이터를 저장합니다.
또한 RESTful API를 기반으로 동작하기 때문에 파이썬은 물론, 다양한 언어에서 쉽게 접근할 수 있다는 장점이 있어요.
🛠️ 빠르고 유연한 검색을 위해 탄생!
기존 SQL의 LIKE
검색으로는 속도와 정확도에서 한계가 있었죠.
Elasticsearch는 역색인(inverted index) 구조를 통해 초고속 검색을 가능하게 합니다.
예를 들어
블로그 제목을 검색할 때 키워드 중심으로 문서를 찾는 방식이에요.
- 문서를 토큰화 (단어로 쪼갬)
- 각 토큰(단어)별로 해당 문서 위치를 저장
- 사용자가 입력한 키워드를 통해 빠르게 매칭
단순한 텍스트 검색이 아니라 자연어 기반 검색도 가능하다는 점에서, AI 시대에 특히 각광받는 이유가 여기에 있답니다.
2. Elasticsearch 설치 및 실행 방법 (로컬 기준) 💻
이제 본격적으로 Elasticsearch를 설치해볼까요?
이 글에서는 로컬 환경(Windows/Mac 기준)에서 설치하는 방법을 알려드릴게요.
Docker를 사용하는 방법도 있지만, 우선은 가장 기본적인 설치부터 차근차근 해봅시다.
📥 설치 전 준비 사항
- Java 11 이상 설치 확인 (Elasticsearch는 JVM 기반)
- 최소 4GB 이상의 메모리 (권장)
🧰 설치 절차 (macOS/Linux/Windows 공통)
- 공식 사이트 접속: https://www.elastic.co/downloads/elasticsearch
- 운영체제에 맞는 패키지 다운로드 (zip, tar.gz)
- 압축 해제 후
bin/elasticsearch
실행
Download Elasticsearch
Download Elasticsearch or the complete Elastic Stack (formerly ELK stack) for free and start searching and analyzing in minutes with Elastic....
www.elastic.co
※ Windows에서는 PowerShell 또는 cmd에서 bin\elasticsearch.bat
실행해도 됩니다!
🌐 실행 확인 방법
설치가 잘 되었다면, 웹 브라우저에서 아래 주소로 접속해보세요.
http://localhost:9200
아래와 같이 JSON 형식의 서버 정보가 출력된다면 설치 성공이에요!
{
"name" : "my-node",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "some_uuid",
"version" : {
"number" : "8.x.x",
...
},
"tagline" : "You Know, for Search"
}
🛑 실행 중 에러가 날 경우?
- JVM 에러 → Java 버전 확인 (Java 17 권장)
- 포트 충돌 → 9200 포트를 다른 서비스가 점유 중인지 확인
Elasticsearch는 백그라운드에서 자동 실행되지 않기 때문에, 개발할 때마다 수동으로 실행하거나 Docker로 환경을 구성하면 편리합니다.
다음 섹션에서 파이썬과 Elasticsearch를 연결하는 코드를 직접 작성해볼 거예요!
3. 파이썬에서 Elasticsearch 연동하기 (Elasticsearch-py 사용법) 🐍
이번에는 파이썬에서 Elasticsearch 서버에 접속하고 데이터를 다루는 방법을 알아봅니다.
가장 대표적으로 사용하는 공식 클라이언트는 elasticsearch-py
라는 모듈이에요.
requests 기반으로 동작하며, JSON으로 API 요청을 보냅니다.
🐍 설치 및 기본 연결
pip install elasticsearch
설치가 완료되었으면, 아래와 같이 서버에 접속해봅시다!
from elasticsearch import Elasticsearch
es = Elasticsearch("http://localhost:9200")
# 서버 연결 확인
if es.ping():
print("✅ 연결 성공!")
else:
print("❌ 연결 실패!")
만약 연결이 되지 않는다면 Elasticsearch 실행 상태나 포트 번호가 맞는지 꼭 확인하세요.
📦 인덱스 생성
# 'my-index'라는 이름의 인덱스 생성
es.indices.create(index="my-index")
※ 같은 이름의 인덱스가 이미 존재한다면 에러가 발생하니, 미리 삭제하거나 try-except로 감싸주세요.
📄 데이터 문서(Document) 추가
doc = {
"title": "엘라스틱서치 입문",
"author": "홍길동",
"published": "2025-04-13"
}
res = es.index(index="my-index", document=doc)
print(res['result']) # created
⚠️ 인덱스 이름은 반드시 소문자
Elasticsearch의 규칙상 인덱스 이름은 무조건 소문자여야 하며, _, -
같은 특수문자만 허용돼요.
대문자 쓰면 바로 오류 납니다!
🔍 간단한 검색 쿼리
# 'title' 필드에서 '입문'이라는 단어를 포함하는 문서 찾기
query = {
"query": {
"match": {
"title": "입문"
}
}
}
res = es.search(index="my-index", body=query)
print(res['hits']['hits'])
이렇게 간단하게도 검색이 가능하답니다!
다음 STEP에서는 CRUD 예제를 하나하나 실습해볼 거예요.
직접 실행하면서 익혀보는 게 가장 빠릅니다. 진짜예요!
4. 문서 인덱싱과 검색: CRUD 실전 예제로 익히기 📄
Elasticsearch를 제대로 활용하려면 CRUD, 즉 생성(Create), 조회(Read), 수정(Update), 삭제(Delete)를 익히는 게 필수예요.
이번엔 이 네 가지 작업을 하나하나 실습하며 이해해봅시다.
📝 Create - 문서 생성
doc = {
"title": "파이썬과 Elasticsearch",
"category": "데이터베이스",
"published": "2025-04-13"
}
res = es.index(index="my-index", id=1, document=doc)
print(res['result']) # created
id=1
을 지정하면 문서를 직접 식별할 수 있어요.
자동으로 ID를 부여할 수도 있지만, 실무에서는 명시하는 경우가 더 많답니다.
🔍 Read - 문서 조회
res = es.get(index="my-index", id=1)
print(res['_source'])
정확한 ID로 조회할 수 있는 것이 Elasticsearch의 강점 중 하나예요.
또한 검색 쿼리를 이용하면 특정 키워드로도 조회할 수 있어요.
✏️ Update - 문서 수정
update_doc = {
"doc": {
"category": "검색엔진"
}
}
res = es.update(index="my-index", id=1, body=update_doc)
print(res['result']) # updated
"doc"
키를 사용해 수정할 필드만 선택적으로 업데이트할 수 있어요.
전체를 덮어쓰지 않으니 안전하고 빠릅니다!
🗑️ Delete - 문서 삭제
res = es.delete(index="my-index", id=1)
print(res['result']) # deleted
삭제도 마찬가지로 ID로 처리합니다.
여러 개를 한 번에 삭제하려면 delete_by_query
를 써야 해요 (다음 단계에서 다룰게요!).
💡 CRUD 요약
작업 | 메서드 | 설명 |
---|---|---|
Create | index() | 문서 추가 |
Read | get(), search() | 문서 조회 |
Update | update() | 필드 수정 |
Delete | delete() | 문서 삭제 |
이제 CRUD는 완전 정복!
다음 단계에서는 Query DSL을 활용한 고급 검색 기법들을 소개할게요.
실무에서 정말 많이 쓰이는 기능이니 놓치지 마세요. 😉
5. 쿼리 DSL로 고급 검색 구현하기 🔍
Elasticsearch의 진짜 매력은 단순 검색이 아닌 다양한 쿼리 조합으로 유연하게 데이터를 찾을 수 있다는 점이에요.
이때 사용하는 것이 바로 Query DSL (Domain Specific Language)입니다.
JSON 형식으로 작성되며, SQL의 WHERE 절보다 훨씬 파워풀합니다!
🧠 match vs term - 헷갈리는 기본 쿼리
가장 기본적인 쿼리는 match
와 term
이에요.
아래 예제를 보세요.
# match: 텍스트 분석 후 검색 (일반 텍스트)
{
"query": {
"match": {
"title": "파이썬"
}
}
}
# term: 분석 없이 정확히 일치하는 값만 검색 (키워드용)
{
"query": {
"term": {
"category": {
"value": "데이터베이스"
}
}
}
}
📌 실전 팁
-
match
: 검색어를 분석해서 키워드로 나눔 (자연어 검색에 적합) -
term
: 완전 일치하는 값을 찾음 (ID, 상태값 검색에 사용)
📋 복합 조건: bool 쿼리
AND, OR, NOT을 조합하고 싶다면 bool
쿼리를 사용하세요.
{
"query": {
"bool": {
"must": [
{ "match": { "title": "파이썬" } },
{ "term": { "category": "데이터베이스" } }
],
"must_not": [
{ "match": { "title": "초급" } }
],
"filter": [
{ "range": { "published": { "gte": "2024-01-01" } } }
]
}
}
}
🧩 bool 구조 요약
구성 요소 | 역할 |
---|---|
must | 모두 일치해야 함 (AND) |
must_not | 일치하면 제외 (NOT) |
should | 하나라도 일치 시 점수 상승 (OR) |
filter | 점수 계산 없이 필터링 |
📈 집계(Aggregation) - 데이터 분석에 활용
SQL의 GROUP BY
처럼 Elasticsearch에서도 데이터 통계를 낼 수 있어요.
이 기능은 Aggregation이라 불리며, 로그 분석과 대시보드에 자주 쓰입니다.
{
"size": 0,
"aggs": {
"category_count": {
"terms": {
"field": "category.keyword"
}
}
}
}
이렇게 하면 category 필드별로 문서 수를 집계할 수 있어요.
단, .keyword
는 텍스트 필드를 집계용으로 사용하는 방법입니다!
다음 단계에서는 이 쿼리들을 활용해서 API 서버를 만들고 검색 서비스로 발전시키는 방법을 보여드릴게요!
6. 실전 활용: 검색 기반 API 서버 구축하기 ⚙️
지금까지 우리는 Elasticsearch의 핵심 개념과 파이썬 연동, 검색 쿼리 작성까지 배웠습니다.
이제 진짜 중요한 단계로 넘어갈 차례예요.
바로 검색 기능을 API로 구현해 실제 서비스에서 사용할 수 있도록 만드는 겁니다.
여기서는 FastAPI
를 사용해서 RESTful 검색 서버를 만드는 과정을 소개할게요.
🚀 FastAPI + Elasticsearch 기본 구조
먼저 필요한 라이브러리를 설치합니다.
pip install fastapi uvicorn elasticsearch
그리고 아래와 같은 간단한 검색 서버를 구성해봅니다.
from fastapi import FastAPI, Query
from elasticsearch import Elasticsearch
app = FastAPI()
es = Elasticsearch("http://localhost:9200")
@app.get("/search")
def search_articles(keyword: str = Query(...)):
query = {
"query": {
"match": {
"title": keyword
}
}
}
res = es.search(index="my-index", body=query)
return [hit["_source"] for hit in res["hits"]["hits"]]
위 코드는 /search?keyword=파이썬
형태로 요청을 보내면, title 필드에서 해당 키워드를 포함하는 문서를 검색해 결과를 JSON으로 반환해줘요.
🧪 로컬 테스트 및 실행
uvicorn main:app --reload
이후 브라우저 또는 Postman에서 아래 주소를 실행해봅니다:
http://127.0.0.1:8000/search?keyword=Elasticsearch
검색된 문서들의 title
, author
, published
필드가 JSON 배열로 반환됩니다.
아주 간단하죠?
💡 응용 팁
- 날짜 필터링 기능을 추가하면 검색 범위를 좁힐 수 있어요 (range 쿼리 활용)
- 키워드 자동완성 기능도 구현 가능 (prefix or completion suggester)
- Vue, React 같은 프론트엔드와 연동하면 실시간 검색 UI도 만들 수 있어요
📦 전체 폴더 구조 예시
📁 elasticsearch_api/
├── main.py
├── requirements.txt
└── README.md
이런 식으로 프로젝트를 구성하면 이후 도커라이징, AWS 배포, GitHub 액션 연동까지도 쉽게 확장할 수 있습니다.
기본부터 탄탄하게 구성하는 게 진짜 실력입니다. 🧱
자, 이제 Elasticsearch는 단순한 도구가 아니라 여러분의 개발 무기예요.
직접 API를 만들어 검색 UX를 완성해보세요!
마무리 🎯
여기까지 따라오시느라 정말 수고 많으셨어요! 😊
이번 글에서는 Elasticsearch의 기본 개념부터 설치, 파이썬 연동, CRUD 실습, 그리고 고급 쿼리 DSL까지 아주 탄탄하게 다뤄봤어요.
단순한 SQL 검색만으로는 해결할 수 없었던 복잡한 요구 사항들, 이제 Elasticsearch로 충분히 커버할 수 있다는 자신감이 생기셨나요?
여러분의 검색 프로젝트에 Elasticsearch가 유용한 무기가 되길 진심으로 바랍니다.
궁금한 점이 있다면 댓글이나 이메일로 편하게 질문 주세요.
그럼, 다음에 또 만나요! 🙌
'Python > Python+Database' 카테고리의 다른 글
파이썬으로 Google BigQuery 연동하기: 클라우드 시대의 데이터 분석 핵심 스킬 (0) | 2025.04.14 |
---|---|
파이썬으로 클라우드 데이터베이스 Amazon RDS 연동하기: DBaaS 완전 정복 가이드 (1) | 2025.04.14 |
파이썬으로 그래프 데이터베이스 Neo4j 연동하기: 관계 중심 데이터의 마법 (0) | 2025.04.14 |
파이썬으로 벡터 데이터베이스 Qdrant 연동하기: AI 검색의 핵심 기술 이해 (0) | 2025.04.14 |
파이썬으로 벡터 데이터베이스 Weaviate 연동하기: 인공지능 시대의 데이터 검색 비법 (1) | 2025.04.14 |