Back to blog

PostgreSQL로 검색 기능 향상: 표준 검색에서 시맨틱 검색까지

August 10, 2026

Ajit Gadge · 2024년 4월 25일

디지털 세계에서 ‘검색’은 매우 흥미로운 주제입니다. 데이터를 텍스트로 바라보면 숫자가 측정과 계산을 위해 존재하는 데이터인 것처럼, 텍스트는 검색을 위해 존재하는 데이터라고 할 수 있습니다. 디지털 시대에는 방대한 텍스트 데이터를 효율적이고 효과적으로 분류하는 능력이 매우 중요합니다.

PostgreSQL은 간단한 패턴 매칭부터 언어 기반의 풀 텍스트 검색, 더욱 복잡한 시맨틱 검색까지 다양한 검색 기능을 제공합니다. 이 글에서는 ‘PostgreSQL & vector’와 관련된 기사를 찾는 예제를 통해 표준 검색, 풀 텍스트 검색, 시맨틱 검색의 차이와 사용 사례, 작동 방식을 살펴봅니다.

예제 데이터는 여러 기사에서 가져온 텍스트를 PostgreSQL의 열(column)에 삽입해 구성했습니다. 이후 PostgreSQL의 tsvector를 활용한 풀 텍스트 검색과 pgvector의 벡터 임베딩을 기반으로 하는 시맨틱 검색을 구현합니다.

다음은 준비한 샘플 데이터입니다.

PostgreSQL 검색 예제에 사용된 샘플 기사 데이터

PostgreSQL 테이블에 여섯 개의 기사를 삽입했습니다. 이제 이 데이터를 이용해 검색해 보겠습니다.


PostgreSQL LIKE 검색과 표준 검색

PostgreSQL LIKE 검색이란?

PostgreSQL에서 LIKE 연산자는 문자열 패턴 매칭에 사용됩니다. 개발자는 특정 패턴과 일치하는 문자열을 검색할 수 있습니다. LIKE는 대소문자를 구분하며, 대소문자를 구분하지 않고 검색하려면 ILIKE를 사용할 수 있습니다.


LIKE 연산자를 사용한 표준 검색의 사용 사례

표준 검색은 정확히 일치하거나 부분적으로 일치하는 항목을 찾는 간단한 쿼리에 적합합니다. 특정 열에서 특정 단어를 검색하거나 해당 단어를 기준으로 데이터를 필터링할 때 유용합니다.

예제: “PostgreSQL” 검색

먼저 ‘PostgreSQL’이라는 단어가 포함된 기사를 검색합니다.

LIKE 연산자로 PostgreSQL 단어를 검색한 결과

단일 단어 검색에서는 원활하게 작동합니다. 그러나 두 단어와 그에 따른 맥락을 포함한 검색은 어떨까요? 이번에는 ‘PostgreSQL & vector’라는 두 단어가 포함된 기사를 검색해 보겠습니다.

LIKE 연산자로 PostgreSQL과 vector를 검색한 결과

‘PostgreSQL & vector’를 검색했지만 결과가 반환되지 않았습니다. 단일 단어 검색에 적합했던 방식이 두 단어 이상과 단어 사이의 맥락을 처리하는 데에는 한계가 있음을 확인할 수 있습니다.


LIKE 연산자의 작동 방식과 한계

LIKE 연산자는 각 행의 데이터를 지정된 패턴과 비교합니다. 이 패턴에는 와일드카드(%)를 포함할 수 있습니다.

  • 기본적으로 B-트리 인덱스가 사용되며, 접두사나 접미사가 있는 검색의 성능을 개선할 수 있습니다.
  • 중간 매칭이 필요한 경우에는 B-트리의 효율이 떨어집니다. 예를 들어 "%PostgreSQL%"과 같은 검색이 이에 해당합니다.

PostgreSQL 확장 기능인 pg_trgm은 이러한 한계를 극복하도록 설계됐으며, 유사 검색이나 풀 텍스트 검색과 유사한 검색 작업을 지원합니다. PostgreSQL에서는 GIN 인덱스를 이용해 텍스트 기반 검색의 성능을 향상시킬 수 있습니다.


PostgreSQL 풀 텍스트 검색: tsvector와 tsquery

PostgreSQL의 tsvectortsquery는 텍스트 검색에 사용하는 데이터 타입과 쿼리 형식입니다.

tsvector의 역할

PostgreSQL에서 tsvector는 텍스트 데이터를 저장하는 데 사용되는 데이터 타입으로, 각 단어의 위치 정보와 단어 목록을 포함합니다. 텍스트를 토큰화하고 불용어(stop words)를 제거하며, 어간 추출(stemming)을 통해 단어를 정규화합니다. 효율적인 검색을 위해 tsvector 열에 인덱스를 생성할 수 있습니다.

tsquery의 역할

tsquerytsvector와 비교해 검색할 때 사용하는 쿼리 형식입니다. PostgreSQL에서는 논리 연산자 AND, OR, NOT을 이용해 복잡한 검색 조건을 정의할 수 있습니다. tsvectortsquery를 함께 사용하면 강력한 텍스트 검색 기능을 구현할 수 있습니다.


풀 텍스트 검색의 사용 사례

풀 텍스트 검색은 대규모 텍스트 데이터에서 세밀한 검색 기능을 제공합니다. 문서 라이브러리나 기사 저장소와 같은 콘텐츠 중심 애플리케이션에서 활용할 수 있습니다.

  • 방대한 텍스트에서 중요한 정보를 찾아야 하는 경우
  • 문서나 기사와 같은 텍스트 기반 데이터를 다루는 경우
  • 더욱 정교한 맥락 기반 검색이 필요한 경우

예제: “PostgreSQL & vector” 풀 텍스트 검색

이제 풀 텍스트 검색을 이용해 두 단어와 맥락이 포함된 검색을 수행해 보겠습니다.

  1. 새로운 열 추가: 풀 텍스트 검색을 수행하기 전에 tsvector 데이터 타입으로 구성된 새로운 열 textsearchable_index_col을 추가합니다.
  2. 데이터 변환: 새로운 열을 기존 title, body 열의 데이터를 기반으로 렉셈(lexeme, 토큰)으로 변환합니다.
    • 매번 수동으로 업데이트할 필요가 없도록 트리거를 설정해 이 작업을 자동화할 수도 있습니다.
  3. GIN 인덱스 생성: 데이터 세트가 크고 복잡한 경우를 대비해 GIN 인덱스를 생성합니다. GIN 인덱스는 풀 텍스트 검색에 최적화돼 있어 대량의 텍스트 데이터에서 검색 성능을 크게 향상시킵니다.

변환 및 인덱스 추가 결과

변환과 인덱스 추가를 완료하면 데이터는 다음과 같은 형태가 됩니다.

풀 텍스트 검색을 위해 변환된 PostgreSQL 데이터

다음은 추가된 데이터의 모습입니다.

PostgreSQL tsvector 열에 추가된 데이터

이제 PostgreSQL 풀 텍스트 검색을 이용해 ‘PostgreSQL & vector’라는 구문을 검색합니다.

PostgreSQL과 vector에 대한 풀 텍스트 검색 결과

이 방식은 더욱 정교합니다. ‘PostgreSQL & vector’를 언급하는 기사를 단어의 순서나 위치와 관계없이 검색할 수 있습니다. 또한 언어 분석을 활용해 관련성이 높은 결과를 제공합니다.


PostgreSQL 풀 텍스트 검색의 작동 방식

PostgreSQL 풀 텍스트 검색은 텍스트를 tsvector를 사용해 렉셈(lexeme, 토큰)으로 분해하고 이를 tsquery와 비교합니다. 역방향 인덱스는 문서 내 단어의 발생 위치를 매핑해 효율적이고 복잡한 검색을 가능하게 합니다. PostgreSQL의 특수 인덱스인 GIN(역방향 인덱스)tsvector 기반 풀 텍스트 쿼리의 속도를 향상시키는 데 도움을 줍니다.


pgvector를 사용한 PostgreSQL 시맨틱 검색

시맨틱 검색의 사용 사례

시맨틱 검색은 텍스트의 의도의미를 이해하는 것이 중요한 애플리케이션에서 활용할 수 있습니다. 대표적인 예로 추천 엔진과 고급 콘텐츠 검색 플랫폼이 있습니다. 생성형 AI(GenAI)를 활용하는 새로운 애플리케이션도 이러한 유사성 검색을 기반으로 만들어지고 있습니다.

예제: “PostgreSQL & vector” 시맨틱 검색

시맨틱 검색을 수행하려면 PostgreSQL의 pgvector 확장 기능을 이용해 기사 데이터를 벡터 데이터 타입으로 임베딩해야 합니다. 이 예제에서는 Python 프로그램과 Hugging Face의 오픈소스 라이브러리를 이용했습니다. 사용한 모델은 SentenceTransformer('all-MiniLM-L6-v2')입니다. 전체 Python 코드는 작성자의 GitHub에서 확인할 수 있습니다.

시맨틱 검색의 작동 방식

시맨틱 검색으로 유사한 기사를 찾으려면 각 기사 사이의 벡터 유사도를 계산해야 합니다. 이 과정은 문서 사이의 의미적 연관성을 파악하고 관련 콘텐츠를 찾는 데 도움을 줍니다.

pgvector 유클리드 거리 연산자를 사용한 유사도 검색 쿼리

위 쿼리는 유클리드 거리 연산자(<->)를 사용해 가장 가까운 기사를 반환합니다. 코사인 거리 연산자(<=>), 내적 연산자(<#>)와 기타 연산자도 사용할 수 있습니다.

  • 코사인 유사도: 다차원 공간에서 두 벡터 사이 각도의 코사인을 측정합니다.
  • 유클리드 거리(Euclidean Distance): 두 점 또는 벡터 사이의 직선거리를 측정합니다.
  • 내적 유사도(Inner Product Similarity): 두 벡터의 내적(Dot Product)을 기반으로 유사도를 측정합니다.

‘PostgreSQL & vector’라는 텍스트를 찾으려면 검색 입력을 벡터로 변환한 뒤 저장된 벡터와 입력 벡터를 매칭해야 합니다. 다음은 이를 구현한 Python 코드 기반 검색 예제입니다.

Python과 pgvector를 이용한 PostgreSQL 시맨틱 검색 결과

‘PostgreSQL’과 ‘vector’ 같은 단어를 문맥에 따라 구분해 유사한 기사를 찾을 수 있습니다. 이것이 유사성 검색(similarity search)의 작동 원리이며, AI 모델을 이용한 다양한 활용 사례에 적용할 수 있습니다.


PostgreSQL 검색 방식별 장단점과 선택 기준

PostgreSQL은 간단한 표준 검색부터 pgvector를 이용한 의미 기반 검색까지 폭넓은 검색 요구 사항을 지원합니다. 각 방식은 서로 다른 시나리오에 적합하므로 사용자 경험과 애플리케이션의 요구 사항에 따라 적절한 접근 방식을 선택해야 합니다.

표준 검색

장점

  • 단순성: LIKE 연산자는 간단하고 이해하기 쉽습니다.
  • 기본 패턴 매칭: %_ 와일드카드를 사용해 텍스트 데이터의 패턴을 매칭할 수 있습니다.

단점

  • 성능: LIKE 쿼리는 대규모 데이터 세트에서 느릴 수 있으며, 전체 테이블 스캔이 필요할 수 있습니다.
  • 기능 제한: 언어 분석, 어간 추출, 관련성 순위 지정과 같은 기능이 부족합니다.
  • 인덱싱 제한: 텍스트 열에 인덱스를 추가해도 와일드카드 검색에서는 성능 향상이 제한적일 수 있습니다.

사용 시점

  • 간단한 패턴 매칭만 필요하고 풀 텍스트 검색 기능이 필요하지 않을 때
  • 데이터 세트가 작거나 성능이 중요한 문제가 아닐 때

풀 텍스트 검색(tsvector 활용)

장점

  • 빠르고 효율적인 검색: 대규모 텍스트 데이터 검색에 최적화돼 있으며, LIKE 쿼리보다 빠른 결과를 제공할 수 있습니다.
  • 언어 분석 지원: 어간 추출, 순위 지정, 언어 분석 등을 지원해 더욱 정확하고 관련성 높은 검색 결과를 제공합니다.
  • 인덱스 지원: GIN 인덱스와 tsvector를 활용하면 복잡한 쿼리의 검색 성능을 크게 향상시킬 수 있습니다.

단점

  • 학습 곡선: tsvector 데이터 타입과 GIN/GiST 인덱스를 구성하고 사용하는 방법을 이해해야 합니다.
  • 설정 부담: 초기 설정과 풀 텍스트 검색 인덱싱 구성에는 표준 검색보다 많은 노력이 필요합니다.

사용 시점

  • 대규모 문서 검색이나 관련성 순위 지정이 필요한 애플리케이션
  • 대규모 텍스트 데이터의 검색 성능이 중요한 경우

시맨틱 검색(pgvector 활용)

장점

  • 향상된 관련성: 코사인 유사도나 유클리드 거리를 이용해 기본 텍스트 매칭보다 정교한 관련성 순위를 제공할 수 있습니다.
  • 유사도 매칭: 텍스트 조각 사이의 유사성을 기반으로 검색할 수 있으며, 맞춤법 검사, 자동 완성, 추천 시스템 등의 애플리케이션에 유용합니다.
  • 문맥 기반 검색: 챗봇과 같은 문맥 기반 애플리케이션에 효과적입니다.

단점

  • 복잡성: 표준 검색이나 풀 텍스트 검색보다 많은 노력과 전문 지식이 필요할 수 있습니다.
  • 자원 소모: 대규모 데이터 세트에서 유사도 점수를 계산하면 많은 자원이 사용돼 성능에 영향을 줄 수 있습니다.

사용 시점

  • 텍스트 데이터 기반의 정밀한 유사도 매칭이나 추천 시스템이 필요한 애플리케이션
  • 시맨틱 유사성을 기반으로 검색 결과의 관련성 순위를 정해야 하는 경우
  • 검색 증강 생성(RAG)과 같은 머신러닝 모델과 문맥 기반 검색을 구현할 때

결론

PostgreSQL의 표준 검색에서 시맨틱 검색으로 이어지는 검색 방식은 개발자가 다양한 수준의 검색 기능을 구현할 수 있도록 지원합니다. ‘PostgreSQL & vector’와 관련된 기사를 검색한 예제에서 확인했듯이, 각 방법은 서로 다른 검색 요구 사항에 적합합니다.

간단한 문자열 패턴에는 LIKE, 대규모 문서와 언어 기반 검색에는 tsvectortsquery, 텍스트의 의미와 문맥을 기반으로 한 검색에는 pgvector를 고려할 수 있습니다. 애플리케이션의 데이터 규모, 검색 목적, 관련성 기준과 필요한 구현 복잡도를 함께 검토해 적절한 방식을 선택하는 것이 중요합니다.


PostgreSQL 검색 FAQ

PostgreSQL의 LIKE와 ILIKE는 어떻게 다른가요?

LIKE는 문자열 패턴을 대소문자를 구분하여 검색합니다. 대소문자를 구분하지 않는 패턴 검색이 필요하면 ILIKE를 사용할 수 있습니다.

PostgreSQL 풀 텍스트 검색에서 tsvector와 tsquery는 어떤 역할을 하나요?

tsvector는 텍스트를 정규화된 렉셈과 위치 정보로 구성하는 데이터 타입입니다. tsquery는 AND, OR, NOT 등의 논리 연산자를 이용해 tsvector와 비교할 검색 조건을 정의합니다.

LIKE 대신 PostgreSQL 풀 텍스트 검색을 사용해야 하는 경우는 언제인가요?

대규모 문서나 기사에서 언어 분석과 관련성 순위 지정이 필요한 경우 풀 텍스트 검색이 적합합니다. tsvector와 GIN 인덱스를 활용하면 복잡한 텍스트 검색을 효율적으로 처리할 수 있습니다.

pgvector를 활용한 시맨틱 검색은 어떻게 작동하나요?

문서와 검색어를 벡터 임베딩으로 변환한 다음 유클리드 거리, 코사인 유사도 또는 내적 등을 계산해 의미적으로 가까운 결과를 찾습니다. 이를 위해 PostgreSQL의 pgvector 확장 기능을 사용할 수 있습니다.

표준 검색, 풀 텍스트 검색, 시맨틱 검색 중 어떤 방식을 선택해야 하나요?

간단한 패턴 매칭에는 LIKE, 대규모 문서와 언어 기반 검색에는 풀 텍스트 검색이 적합합니다. 텍스트의 의미와 문맥을 기반으로 유사한 결과를 찾아야 한다면 pgvector를 활용한 시맨틱 검색을 고려할 수 있습니다.


본문: Enhancing Search Capabilities with PostgreSQL: From Standard to Semantic

이메일: salesinquiry@enterprisedb.com

Share this