0Pricing
SQL Academy · 강의

tsvector와 GIN을 활용한 전문 검색

tsvector 열, GIN 인덱스, 설정 가능한 텍스트 검색 사전으로 운영 환경의 전문 검색을 구축해보세요.

tsvector와 GIN을 활용한 전문 검색은(는) CoddyKit의 무료 SQL Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 SQL Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. SQL Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

부분 문자열을 넘어선 단어 기반 검색

전문 검색(FTS)은 어간 추출, 불용어, 순위 지정처럼 단어를 이해합니다. PostgreSQL에는 tsvector 및 tsquery 자료형을 통해 이 기능이 기본 제공됩니다.

tsvector 만들기

문서를 구문 분석합니다.

SELECT to_tsvector('english', 'The quick brown foxes jumped over');
-- 'brown':3 'fox':4 'jump':5 'quick':2

tsquery 만들기

쿼리를 구문 분석합니다.

SELECT to_tsquery('english', 'fox & jumping');     -- 'fox' & 'jump'
SELECT websearch_to_tsquery('english', 'fox jumping -lazy');

일치시키기: @@

문서를 쿼리와 대조합니다.

SELECT 'fox jumping'::tsvector @@ 'fox & jump'::tsquery;     -- t

FTS 인덱싱

tsvector 열과 GIN 인덱스를 추가합니다.

ALTER TABLE articles
  ADD COLUMN search_doc tsvector
    GENERATED ALWAYS AS (
      to_tsvector('english', coalesce(title,'') || ' ' || coalesce(body,''))
    ) STORED;

CREATE INDEX articles_search_idx ON articles USING GIN (search_doc);

쿼리 실행

빠른 필터링 검색입니다.

SELECT id, title FROM articles
WHERE search_doc @@ websearch_to_tsquery('english', 'postgres performance')
ORDER BY ts_rank(search_doc, websearch_to_tsquery('english', 'postgres performance')) DESC
LIMIT 20;

ts_rank로 순위 지정

ts_rank는 단어의 빈도와 위치를 기준으로 결과에 점수를 부여합니다. ts_rank_cd는 커버 밀도(위치를 고려함)를 사용합니다.

SELECT id, ts_rank_cd(search_doc, q) AS rank
FROM articles, websearch_to_tsquery('english', $1) AS q
WHERE search_doc @@ q
ORDER BY rank DESC LIMIT 20;

ts_headline로 스니펫 만들기

일치하는 단어를 강조 표시하여 일치한 부분을 보여 줍니다.

SELECT ts_headline('english', body,
  websearch_to_tsquery('english', $1),
  'StartSel=<mark>, StopSel=</mark>, MaxFragments=2')
FROM articles
WHERE search_doc @@ websearch_to_tsquery('english', $1);

구문 검색

서로 인접한 단어를 찾습니다.

SELECT * FROM articles
WHERE search_doc @@ phraseto_tsquery('english', 'database performance');

여러 필드에 가중치 적용

setweight를 사용하여 본문보다 제목에 더 큰 가중치를 부여합니다.

ALTER TABLE articles
  ADD COLUMN search_doc tsvector
    GENERATED ALWAYS AS (
      setweight(to_tsvector('english', coalesce(title,'')), 'A') ||
      setweight(to_tsvector('english', coalesce(body,'')),  'B')
    ) STORED;

언어 설정

english 설정은 불용어와 어간 추출 등을 정의합니다. PostgreSQL에는 여러 언어가 기본 제공되므로 언어별로 전환할 수 있습니다.

SELECT to_tsvector('turkish', 'Veritabanı performansı');

기본 제공 FTS의 한계

영어와 비슷한 언어와 기본적인 순위 지정에 적합합니다. 더 고급 기능(BM25, 벡터 임베딩, 패싯 검색)이 필요하다면 Postgres와 함께 Elasticsearch 또는 OpenSearch를 사용하는 방안을 고려해 보십시오.

요약

PostgreSQL FTS는 충분히 훌륭한 기본 선택입니다.

  • tsvector + tsquery + @@ 일치
  • 속도를 위한 GIN 인덱스
  • 사람이 입력한 값을 위한 websearch_to_tsquery
  • 순위가 지정되고 강조 표시된 결과를 위한 ts_rank/ts_headline

빠른 확인

전문 검색 쿼리로 문서를 빠르게 필터링해야 합니다. 어떤 인덱스를 사용해야 합니까?

자주 묻는 질문

“tsvector와 GIN을 활용한 전문 검색” 강의는 무료인가요?

네 — “tsvector와 GIN을 활용한 전문 검색” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 SQL Academy 강의 전체를 잠금 해제할 수 있습니다. SQL Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“tsvector와 GIN을 활용한 전문 검색”에서 뭘 배우나요?

tsvector 열, GIN 인덱스, 설정 가능한 텍스트 검색 사전으로 운영 환경의 전문 검색을 구축해보세요. 브라우저에서 직접 실행하는 실습 코드로 SQL Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

SQL Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 SQL Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.

“tsvector와 GIN을 활용한 전문 검색” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 SQL Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 SQL Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 트라이그램 검색(pg_trgm)으로 퍼지 매칭하기
  2. tsvector와 GIN을 활용한 전문 검색
  3. PostGIS를 활용한 공간 인덱싱
  4. pgvector를 활용한 벡터 검색
← SQL Academy(으)로 돌아가기