피드로 돌아가기
Why SQLite FTS5's default tokenizer drops your Japanese substrings (and the one-line fix)
Dev.toDev.to
Database

SQLite FTS5 trigram 도입을 통한 CJK 언어 검색 누락 해결 및 인덱스 최적화

Why SQLite FTS5's default tokenizer drops your Japanese substrings (and the one-line fix)

Omochi2026년 6월 9일9intermediate

Context

SQLite FTS5의 기본 tokenizer인 unicode61 사용 시 공백 기반 분절 방식으로 인해 일본어, 한국어 등 CJK 언어의 부분 일치 검색이 불가능한 한계 존재. 특히 토큰 전체가 일치하지 않으면 검색 결과에서 누락되는 Silent Recall 문제 발생.

Technical Solution

  • word boundary 기반의 unicode61 대신 3글자 단위 슬라이딩 윈도우 방식의 trigram tokenizer 채택
  • 입력 문자열을 모든 가능한 3-character window로 분할하여 인덱싱함으로써 언어별 공백 유무와 무관한 Substring Search 구현
  • Git을 Source of Truth로 하여 데이터 영속성을 확보하고 SQLite를 Rebuild 가능한 Disposable Index로 활용하는 2-layer 설계 적용
  • 3글자 미만 쿼리 시 발생하는 성능 저하 및 Expensive Query Plan 방지를 위해 Application Layer에서 최소 길이 필터링 적용
  • JSON 기반 Event Store 구조를 통해 개별 결정 사항(Decision) 단위의 정밀한 데이터 기록 및 인덱싱 체계 구축

1. CJK 언어 검색 필요 시 FTS5의 `tokenize='trigram'` 옵션 검토

2. Trigram 인덱스 사용 시 3자 미만 쿼리에 대한 예외 처리 로직 구현

3. 데이터 복구 및 버전 관리가 중요하다면 Git(저장소)과 SQLite(인덱스)를 분리한 하이브리드 구조 고려

원문 읽기