실제 서비스 쿼리의 모습
전체 테이블에서 가장 가까운 열 개만 찾는 경우는 드물어. 보통은 특정 테넌트와 프로젝트에 속하고, 어떤 시점 이후 갱신됐으며, 사용자가 읽을 권한이 있는 결과 가운데 가장 가까운 열 개를 원해. pgvector를 쓰면 이 조건을 SQL문 하나로 적고 구조화 필터는 Postgres에 맡길 수 있어.
인덱스의 동작을 고려한 필터
HNSW와 IVFFlat 인덱스가 근사 최근접 이웃을 먼저 찾고 WHERE 조건은 그 후보 집합에 적용될 수 있어. 조건이 후보를 매우 많이 거른다면 CTE나 부분 인덱스를 이용해 Postgres가 먼저 필터한 뒤 순위를 매기게 해. 실제 실행 방식은 EXPLAIN ANALYZE로 측정해야 해.
반복적으로 후보를 넓히는 방식
인덱스가 후보 열 개를 돌려줬는데 필터를 통과한 결과는 세 개뿐일 수 있어. 이럴 때는 가까운 후보 100개를 넉넉히 가져와 조건을 적용하고, 남은 결과에서 상위 열 개를 골라. 얼마나 넉넉히 가져올지는 실제 데이터로 조정해.