정규화된 입력과 locale에 맞는 query·엔터티를 제한된 `k`개로 반환합니다.
검색 자동완성
시스템 설계
자동완성은 검색창의 장식이 아닙니다. 한 글자 입력마다 빠르게 후보를 찾고, 인기의 신호를 안전하게 다루며, 삭제·정책 변경을 추천보다 먼저 반영해야 하는 짧고 민감한 읽기 경로입니다.
정규화된 후보를 Trie/FST와 작은 top-k로 미리 만들고, 요청은 prefix cache → locale index → 정책 필터 → 제한된 재정렬 순서로 처리합니다. 빠른 cache는 삭제·금지·비공개 후보를 보여도 된다는 권한이 아니므로 invalidation과 최종 정책 확인을 함께 설계합니다.
빠른 제안보다 노출 경계를 먼저 정한다
추천 후보는 전체 검색 결과가 아닙니다. 어떤 locale의 query·엔터티를 보여 줄지, 개인화가 가능한지, 삭제와 safe-search를 어떤 시간 안에 반영할지를 계약으로 분리합니다.
키 입력마다 full scan을 하지 않고 cache와 작은 index lookup에 예산을 둡니다.
삭제·비공개·tenant·safe-search 필터가 인기도보다 먼저 후보를 제거합니다.
의존성이 불명확할 때 무관한 인기어 대신 빈 배열 또는 명시된 fallback을 반환합니다.
후보 생산과 키 입력의 읽기 경로를 분리한다
검색·선택 신호와 카탈로그·운영 정책은 builder가 검증한 후보로 모읍니다. 클라이언트 요청은 cache와 FST/Trie를 거쳐 작은 후보를 얻고, 정책을 적용한 뒤에만 재정렬합니다.
정규화·빌드와 lookup·필터를 각각 복구 가능하게 둔다
검색·선택·카탈로그 변경을 모으고 bot·비정상 요청을 후보 점수와 분리합니다.
locale과 버전을 명시해 표면형·canonical text·후보 상태를 만듭니다.
검증된 후보와 제한된 top-k로 versioned artifact를 빌드·canary 배포합니다.
hot prefix cache를 먼저 보고 miss이면 locale shard에서 후보를 가져옵니다.
삭제·safe-search·tenant 필터 후 신선도·품질을 적용하고 이벤트를 비동기로 남깁니다.
lookup 속도와 build·인덱스·정책 비용을 함께 비교한다
FST, Trie, n-gram 색인, 매 요청 검색은 모두 후보를 찾는 방법입니다. 한 방식의 장점은 데이터 모델·언어 분석·신선도·memory budget에 따라 제약이 됩니다.
| 선택 | 장점 | 제약 | 적용 판단 |
|---|---|---|---|
| Trie terminal top-k | prefix lookup이 단순하고 빠름 | prefix별 후보 복제가 메모리를 키움 | 명확한 prefix UX, 제한된 후보 사전 |
| FST suggester | 압축·빠른 lookup 가능 | build, weight bucket, artifact 운영 필요 | 큰 준정적 사전, snapshot 배포 역량 |
| search_as_you_type | prefix·infix와 검색 stack을 함께 사용 | subfield·index size·query 비용 증가 | 다단어 문장, 기존 검색 인덱스 재사용 |
| 원문 매 요청 검색 | 변경 데이터 반영이 단순 | keystroke마다 CPU·tail latency 발생 | 작은 카탈로그, 초기 제품 |
| global top-k | cache 효율·설명이 쉬움 | 지역·맥락 relevance가 제한 | privacy 우선 기본 결과 |
| 개인화 re-rank | 문맥 적합성을 높일 여지 | feature·동의·필터·실험 복잡도 | 명시된 동의와 안전 경계가 있을 때 |
빠른 입력 경로의 실패를 안전한 fallback으로 제한한다
새 후보가 배포되지 않거나 artifact 손상으로 shard가 시작하지 못합니다.
짧은 인기 입력이 cache miss와 동시 origin lookup을 증폭합니다.
삭제·금지·비공개 후보가 stale cache나 index에 남을 수 있습니다.
반복 요청이나 부정 click이 인기 점수와 후보 품질을 왜곡합니다.
큰 artifact나 warm-up 때문에 OOM·tail latency·locale 실패가 발생합니다.
카탈로그·개인화 의존성이 늦어져 후보가 비거나 전체 요청이 지연됩니다.
개인정보, 관측, 비용은 인덱스 밖에서도 관리한다
raw query와 계정·IP를 동일한 장기 로그에 묶지 않고, 개인화는 동의·권한·별도 저장 경계를 전제로 합니다. response에는 내부 weight와 feature를 보내지 않습니다.
tier별 p99, prefix cache hit, index version skew, policy filter, revoke-to-hide, zero-result-after-filter, abuse reject를 분리해 봅니다.
FST/Trie RAM, snapshot build·배포, cache replica, event 집계, 정책 의존성, 개인정보 접근 통제가 비용을 만듭니다. 긴 TTL은 origin 비용과 철회 지연을 맞바꿉니다.
공식·1차 출처
- Elastic — Search suggesters: completion suggester와 context·duplicate·shard 관련 공식 문서.
- Elastic — Search-as-you-type field type: prefix/infix, subfield와 index-size trade-off 공식 문서.
- Apache Lucene — FSTCompletion API: finite-state completion과 weight bucket의 공식 API 문서.
- Apache Lucene — FSTCompletionLookup API: lookup adapter와 weight discretization 공식 API 문서.
- 이 페이지의 규모, top-k, TTL, popularity 식, SLO와 정책 기준은 학습용 설계 가정입니다. 실제 도입 전에는 현재 품질·안전·개인정보 정책과 locale별 analyzer, 부하·장애 실험으로 검증합니다.
작성·검토·참고 자료
참고 자료
- Elastic — Search suggesters: `completion` suggester, duplicate 처리, context suggester와 shard 관련 공식 문서.
- Elastic — Search-as-you-type field type: prefix/infix 지원, subfield와 index-size trade-off의 공식 문서.
- Apache Lucene — FSTCompletion API: finite-state 기반 completion과 weight bucket의 공식 API 문서.
- Apache Lucene — FSTCompletionLookup API: Lookup adapter와 weight discretization의 공식 API 문서.
- 이 문서의 DAU, QPS, top-k, TTL, popularity 식, 정책과 SLO는 학습용 설계 가정이다. 실제 도입 전에는 검색 품질, 안전 정책, 개인정보·보존 의무, locale별 analyzer, 부하·장애 실험으로 검증한다.
사실 오류·출처 정정은 문의·정정 페이지로 알려 주세요.