Full-Text Search — tsvector · tsquery · 한국어 형태소 · 랭킹
📋 실습 안내
✏️ CODE EDITOR (JSX)
▶ 실행 버튼을 눌러 코드를 테스트하세요.
👁️ 내 미리보기
내 코드 실행 결과
🎯 완성 미리보기
목표
위 에디터 코드를 수정해서 이 결과물과 똑같이 만들어보세요!
💡 TODO 주석을 채워서 위 결과물처럼 동작하게 만들어보세요
🤖 AI 선생님에게 질문하기
이번 강의 전용
▼
선생님이 답변 중이에요...
⚠️ 학습 관련 질문만 답변합니다. 관련 없는 질문은 자동으로 학습으로 유도됩니다.
Q1. to_tsvector('english', 'running quickly')의 결과에 포함되는 lexeme는?
💡 english 설정은 스테밍(어간 추출)을 적용합니다. 'running' → 'run', 'quickly' → 'quick'으로 어간이 추출됩니다. simple 설정은 어간 추출 없이 소문자 변환만 합니다. 한국어에서는 형태소 분석기가 없으면 simple을 사용해야 합니다.
Q2. websearch_to_tsquery와 to_tsquery의 가장 중요한 차이는?
💡 websearch_to_tsquery는 사용자가 입력한 일반 텍스트를 안전하게 tsquery로 변환합니다. 특수문자(&, |, ! 등)나 잘못된 형식이 있어도 오류 없이 처리합니다. to_tsquery는 정확한 tsquery 문법이 필요하며 잘못된 입력 시 오류가 발생합니다. 사용자 검색창 입력은 반드시 websearch_to_tsquery나 plainto_tsquery를 사용하세요.
Q3. ts_headline()의 주요 역할은?
💡 ts_headline()은 원본 텍스트에서 검색어가 포함된 부분을 추출하고, 지정한 StartSel/StopSel 태그로 검색어를 감싸 하이라이팅합니다. 검색 결과 미리보기(excerpt) 생성에 사용합니다. ts_rank()는 랭킹 점수 계산에 사용합니다.
Q4. 한국어 부분 검색에 가장 적합한 PostgreSQL 확장은?
💡 pg_trgm은 트라이그램(3자 연속 문자) 인덱스를 생성하여 LIKE '%검색어%' 쿼리를 인덱스로 처리합니다. 한국어처럼 형태소 분석이 어려운 언어에서 부분 문자열 검색에 효과적입니다. pg_bigm은 바이그램(2자)으로 더 세밀한 한국어 검색을 지원합니다.
Q5. GENERATED ALWAYS AS ... STORED 컬럼에 GIN 인덱스를 생성하는 이유는?
💡 tsvector를 GENERATED COLUMN으로 저장하면, GIN 인덱스를 생성할 수 있습니다. GIN 인덱스가 있으면 @@ 검색 시 Seq Scan 대신 Bitmap Index Scan을 사용해 수십~수백 배 빠른 검색이 가능합니다. 인덱스 없이 to_tsvector()를 WHERE에 직접 쓰면 모든 행을 순차 스캔합니다.
😅
아쉽네요!
점수: 0점 — 70점 이상이 되어야 통과합니다.