왜 ts_rank_cd가 아니라 row_number?
ts_rank_cd는 인덱스를 타지 못한다. WHERE 절로 매칭된 후보에만 적용해야 비용이 합리적이다.
핵심 트레이드오프:
- WHERE fts @@ websearch_to_tsquery(...)로 GIN 인덱스 활용 → 후보 압축
- ts_rank_cd로 후보 내부 순위 결정 → 결과는 작아서 비싸지 않음
- limit match_count × 2로 양쪽에서 충분한 candidate를 뽑고 RRF로 fusion
- 너무 작게 뽑으면 fusion 효과 소실 (한쪽에서 누락된 항목은 다른 쪽 랭크만 기여)
실측 권장: match_count × 2 ~ × 5 사이에서 recall과 latency를 보고 튜닝.