피드로 돌아가기
🔍 Como tornei milhões de conversas históricas "invisíveis" buscáveis em tempo real
Dev.toDev.to
Backend

Elasticsearch 및 Hybrid Search 도입을 통한 수백만 개 파일의 실시간 검색 구현

🔍 Como tornei milhões de conversas históricas "invisíveis" buscáveis em tempo real

Milton Camara2026년 5월 11일5advanced

Context

수백만 개의 JSON 파일이 Storage에 저장되어 있으나, 파일명에 가변 데이터가 누락되어 내부 콘텐츠 기반 검색이 불가능한 상태. 대규모 파일의 선형 스캔으로 인한 성능 저하와 데이터 가시성 결여가 주요 병목 지점으로 작용함.

Technical Solution

  • System.Threading.Channels 기반의 Producer/Consumer 파이프라인을 구축하여 메모리 압력을 제어하며 대량의 데이터를 병렬 처리하는 구조 설계
  • Discriminated Union 패턴의 ParseResult를 도입하여 데이터 부정합성(HTML entities, 잘못된 날짜 형식 등)에 대응하는 Tolerant Parser 구현
  • Storage의 Prefix Lookup과 Elasticsearch의 Full-text Search를 병렬로 쿼리한 후 결과를 통합하는 Hybrid Search 전략 채택
  • Elasticsearch의 필드별 Boost 설정을 통해 구조화된 필드 검색 결과의 우선순위를 높이는 랭킹 최적화 적용
  • Index Alias 교체 방식을 통해 운영 중단 없이 전체 데이터를 다시 인덱싱할 수 있는 Zero-downtime Reindexation 환경 구축
  • 외부 Storage에 진행 상태를 저장하는 Stateless Checkpointing을 적용하여 Pod 장애 시 중단 지점부터 재개 가능한 복구 메커니즘 설계

1. 대규모 배치 처리 시 메시지 큐 도입 전 In-process Channels로 단순화 가능성 검토

2. 데이터 정제 단계에서 실패한 레코드가 전체 파이프라인을 중단시키지 않도록 Try-Get 기반의 방어적 파싱 설계

3. 검색 정확도 향상을 위해 단순 일치 검색과 전문 검색의 가중치를 분리한 Hybrid Ranking 적용

4. 인덱스 스키마 변경 가능성을 고려하여 물리 인덱스와 논리 Alias를 분리한 운영 전략 수립

원문 읽기