PostgreSQL Full Text Search를 활용한 강력한 검색 기능 구현하기
1. 검색의 중요성: LIKE %keyword%의 한계
데이터가 많아질수록 데이터베이스의 LIKE 연산자는 성능 저하의 주범이 됩니다. 인덱스를 탈 수 없기 때문입니다. 하지만 별도의 검색 엔진(Elasticsearch 등)을 도입하기 부담스러운 규모라면, PostgreSQL이 제공하는 **Full Text Search(FTS)**는 매우 훌륭한 대안이 됩니다.
2. PostgreSQL FTS의 핵심 개념
- tsvector: 검색 대상이 되는 텍스트를 단어 단위로 쪼개어(Lexemes) 저장하는 전용 타입.
- tsquery: 검색어에 대한 논리 연산(AND, OR, NOT 등)을 수행하는 타입.
- GIN Index:
tsvector전용 인덱스로, 대규모 데이터에서도 빠른 검색 속도를 보장.
3. 기본 검색 쿼리 예제
문장에서 특정 단어를 찾는 가장 단순한 형태입니다.
SELECT title, content
FROM posts
WHERE to_tsvector('english', content) @@ to_tsquery('english', 'search & guide');
4. GIN 인덱스 적용으로 성능 최적화
검색 성능을 비약적으로 향상시키기 위해 인덱스를 생성합니다.
-- GIN 인덱스 생성
CREATE INDEX idx_posts_content_fts ON posts USING GIN (to_tsvector('english', content));
-- 조회 성능 확인 (EXPLAIN ANALYZE)
EXPLAIN ANALYZE
SELECT * FROM posts WHERE to_tsvector('english', content) @@ to_tsquery('english', 'optimization');
5. PostgreSQL FTS의 장점
- 관리 간소화: 별도의 검색 엔진 서버(Elasticsearch 등)를 유지보수할 필요가 없음.
- 데이터 정합성: 메인 DB에서 데이터가 수정되는 즉시 검색 결과에 반영됨.
- 풍부한 기능: 가중치 부여(Ranking), 하이라이트 표시 등을 기본 지원.
6. 결론
PostgreSQL의 FTS를 활용하면 데이터베이스만으로도 강력한 검색 기능을 구현할 수 있습니다. 시스템의 복잡도를 낮추면서도 사용자에게 높은 품질의 검색 경험을 제공해 보세요.