한 비디오 호스팅 서비스의 엔지니어링 팀은 SQLite FTS5 인덱스를 OpenSearch 클러스터로 교체하여, 검색 결과 없음(zero-result) 쿼리를 12%에서 1.4%로 줄이고, 검색 후 클릭률(search-to-click rate)을 9% 높이는 동시에 지연 시간(latency)을 28ms 미만으로 유지했습니다.

전환이 시급해진 이유

SQLite의 전체 텍스트 검색 확장 기능(FTS5)은 매력적입니다. 데이터의 나머지 부분과 동일한 파일에 저장되고, 라이선스 비용이 없으며, 정확한 토큰 일치에 대해 즉각적인 결과를 반환합니다. 하지만 플랫폼 로그를 확인한 결과, 사용자 검색의 12%가 아무런 결과도 반환하지 않았습니다. "intersteller"나 "avengrs endgame"과 같이 모바일 키보드에서 흔히 발생하는 오타가 주요 원인이었습니다.

트라이그램(trigrams, 3글자 조각)을 사용한 간단한 해킹으로 검색 결과 없음 비율을 7%까지 낮췄지만, 두 가지 문제가 발생했습니다. 첫째, 인덱스 크기가 원래보다 3배 이상 커져 저장 비용이 증가하고 업데이트 속도가 느려졌습니다. 둘째, 관련성(relevance)이 떨어졌습니다. 퍼지 매칭(fuzzy matching)이 관련 없는 비디오들을 노이즈처럼 섞어서 반환하여, 사용자를 안내하는 대신 혼란을 주었습니다.

팀은 오타 허용(typo-tolerance) 기능과 정교한 관련성 점수 산정(relevance scoring) 기능을 갖춘 전용 검색 엔진이 필요하다는 결론을 내렸습니다.

OpenSearch 파이프라인 구축하기

SQLite를 신뢰할 수 있는 단일 원천(source of truth)으로 유지

OpenSearch는 일시적인 읽기 전용 복제본(replica) 역할을 했습니다. 모든 비디오 메타데이터는 SQLite에 유지되었으며, 데이터 손실 위험 없이 검색 인덱스를 재구축할 수 있었습니다. OpenSearch 클러스터에 장애가 발생하면 애플리케이션은 자동으로 기존 FTS5 엔진으로 전환(fallback)되었습니다.

"should" 쿼리를 통한 계층적 관련성 구현

퍼지 매칭에만 의존하는 대신, 쿼리에 세 가지 절(clause)을 결합했습니다:

  • 정확한 구문 일치(Exact phrase match) – 가장 높은 가중치(boost)를 부여하여 제목을 정확하게 입력한 사용자에게 보상합니다.
  • 모든 용어 포함(All terms present) – 중간 가중치를 부여하여 모든 단어가 포함되어 있지만 반드시 순서대로 나타나지는 않는 쿼리를 포착합니다.
  • 퍼지 매칭(Fuzzy match) – 낮은 가중치를 부여하여 오타가 있는 토큰에 대한 안전망 역할을 합니다.

이러한 계층 구조는 깔끔한 쿼리에 대해서는 정밀도를 유지하면서도, 오타에 대해서는 관대한 폴백(fallback)을 제공했습니다.

퍼지 설정 튜닝

접두사 길이(prefix length)를 1로 설정하여, 퍼지 로직이 작동하기 전에 각 용어의 첫 글자가 반드시 일치하도록 했습니다. 이 규칙은 검색 속도를 빠르게 유지하고 메모리를 과부하시킬 수 있는 후보 용어의 폭발적인 증가를 방지했습니다. 또한 팀은 용어 확장(term expansions)의 최대 개수를 제한하여 리소스의 무분별한 사용을 방지하는 안전장치를 마련했습니다.

동기화 전략

세 가지 상호 보완적인 프로세스가 OpenSearch 인덱스를 SQLite와 일치하게 유지합니다:

  • 새 데이터를 동기화하는 크론 잡(cron job).
  • 야간 차이 분석(Nightly diff pass) – 증분 업데이트(incremental updates) 과정에서 누락된 불일치 사항을 스캔합니다.
  • 주간 전체 재구축(Weekly full rebuild) – 인덱스 별칭(alias) 뒤에서 실행된 후, 단일 작업으로 별칭을 교체하여 다운타임이 전혀 없음을 보장합니다.

2주 후의 측정 가능한 성과

  • 검색 결과 없음 쿼리가 12%에서 1.4%로 감소했습니다.
  • 검색 후 클릭 전환율이 9% 상승했습니다.
  • 중간 지연 시간(median latency)은 플랫폼의 사용자 경험 목표치인 28ms 미만을 유지했습니다.

주의 사항 및 반론

이 마이그레이션은 단순히 플러그 앤 플레이(plug-and-play) 방식의 업그레이드가 아닙니다. 팀은 기본 데이터베이스를 검색 엔진으로 대체해서는 안 된다는 점을 강조합니다. SQLite는 여전히 모든 비디오 메타데이터를 관리하는 권위 있는 저장소(authoritative store)로 남습니다.

핵심 요약

전용 검색 엔진을 통해 오타 허용 기능을 추가함으로써, 사용자 여정에서 눈에 띄던 막다른 길을 매끄럽고 빠른 경험으로 바꾸었습니다. 이번 사례 연구는 관계형 저장소를 신뢰할 수 있는 단일 원천으로 유지하고, 관련성을 계층화하며, 퍼지 로직을 보호하는 절제된 아키텍처가 안정성을 희생하지 않으면서도 측정 가능한 이득을 가져다줄 수 있음을 보여줍니다.

Source: https://dev.to/ahmet_gedik778845/migrating-video-title-search-from-sqlite-fts5-to-opensearch-fuzzy-queries-4bhj