ParadeDB pg_search로 PostgreSQL에서 Elasticsearch 대체하기 — BM25 전문 검색과 pgvector 하이브리드 랭킹을 단일 쿼리로 구현하는 실전 가이드
| 쓰기 성능 | v0.20.0에서 백그라운드 머징 도입 후 쓰기 처리량 10배 향상 (상세 조건은 릴리스 노트 참고) |
| 한국어 지원 | korean_lindera (KoDic) 및 icu 토크나이저로 한국어 형태소 분석 가능 |
단점 및 한계
| 항목 | 내용 |
|---|---|
| 초대규모 분산 검색 | 수십억 문서 수준의 분산 샤딩·레플리케이션은 Elasticsearch가 여전히 우위 |
| 고동시성 고부하 | 동시 클라이언트 50개 이상 구간에서 Elasticsearch 대비 전체 TPS가 낮게 나타남 (Tembo 벤치마크, 상세 조건은 원문 참고) |
| 1억 개 초과 벡터 | pgvector 구조적 한계로 Qdrant, Milvus 대비 성능 열위 (pgvectorscale 병행이 완화책) |
| 크로스 인코더 리랭킹 | 학습된 리랭커가 내장되지 않아 고정밀 리랭킹은 애플리케이션 레이어에서 별도 구현 필요 |
| PostgreSQL 15+ 제약 | 공식 지원은 PostgreSQL 15 이상 |
| Elastic Stack 전체 대체 불가 | Kibana, Logstash, APM 등을 통째로 쓰고 있다면 검색 부분만 대체됩니다 |
시나리오별 적용 패턴
| 시나리오 | 핵심 조합 | 이점 |
|---|---|---|
| SaaS 문서·이슈 검색 | BM25 단독 | ETL 파이프라인 제거, ACID 보장 |
| 전자상거래 상품 검색 | BM25 + 행동 임베딩 RRF | 키워드 + 취향 동시 반영 |
| RAG 파이프라인 | BM25 + 청크 임베딩 RRF | 컨텍스트 품질 향상 |
| 실시간 로그 검색 | BM25 단독 즉시 색인 | refresh_interval 지연 제거 |
마치며
- pg_search는 Tantivy 기반 BM25를 PostgreSQL 네이티브 인덱스로 제공하며, ETL 없이 실시간 전문 검색이 가능합니다.
- pgvector와 RRF를 결합한 하이브리드 검색으로 키워드 정밀도와 의미론적 이해를 단일 데이터베이스 쿼리에서 모두 얻을 수 있습니다.
- 수천만 행 이하, PostgreSQL 이미 운영 중인 팀에게는 Elasticsearch를 걷어내는 가장 현실적인 경로입니다.
바로 시작해 보고 싶다면 이 순서로 접근하면 됩니다.
-
환경 확인 및 확장 활성화 — PostgreSQL 15+ 환경에서
CREATE EXTENSION pg_search와CREATE EXTENSION vector를 실행합니다. Neon을 사용 중이라면 한 줄로 끝납니다. -
기존 테이블에 BM25 인덱스 추가 —
USING bm25 (...) WITH (key_field = 'id')로 인덱스를 생성하고@@@연산자로 기존LIKE검색이나tsvector검색을 대체해 보면 됩니다.paradedb.score()로 랭킹 점수를 바로 확인할 수 있습니다. -
임베딩 컬럼 추가 후 RRF 쿼리 도입 — 텍스트 컬럼에 임베딩 벡터를 추가하고, FULL OUTER JOIN 패턴으로 하이브리드 랭킹을 적용해 보면 됩니다. 키워드만 매칭됐던 결과가 의미론적으로 유사한 문서까지 포함되는 변화를 직접 확인할 수 있습니다.
ParadeDB 공식 사이트(paradedb.com)에 공개된 고객 사례를 보면 여러 프로덕션 환경에서 이미 쓰이고 있으며, v0.24.2 기준으로 안정성도 충분히 검증된 단계입니다. 우선 개발 환경에서 작은 테이블 하나에 인덱스를 달고 @@@ 쿼리로 paradedb.score()를 직접 찍어보는 것이 가장 빠른 판단 방법입니다.
참고 자료
- ParadeDB 공식 문서
- pg_search GitHub 저장소
- ParadeDB 블로그: pg_search Elastic-Quality Full Text Search 소개
- ParadeDB 블로그: Hybrid Search in PostgreSQL — The Missing Manual
- ParadeDB 블로그: Full Text Search over Postgres — Elasticsearch vs. Alternatives
- ParadeDB 블로그: Deep Dive into ParadeDB's v2 API
- ParadeDB 블로그: Teaching Postgres to Facet Like Elasticsearch
- ParadeDB 블로그: Postgres as a Recommender Engine
- ParadeDB: BM25 구현 학습 가이드
- Neon: Comparing Native Postgres, ElasticSearch, and pg_search for Full-Text Search
- Neon Docs: The pg_search extension
- Tembo: Benchmarking ParadeDB's pg_search
- ParadeDB 0.20.0 릴리스 노트
- ParadeDB Tokenizers 문서
- DEV.to: Hybrid Search in 100 Lines — BM25 + pgvector with RRF Merge
- TigerData: Elasticsearch's Hybrid Search, Now in Postgres
- ParadeDB: pgvector Limitations
- DeepWiki: paradedb/paradedb 아키텍처 분석