ある動画配信サービスのエンジニアリングチームは、SQLite FTS5インデックスをOpenSearchクラスターに切り替えた。その結果、検索結果がゼロとなるクエリが12%から1.4%に減少し、検索からクリックへの転換率(search-to-click rate)が9%向上した一方で、レイテンシは28ms未満に抑えられた。
なぜ切り替えが急務となったのか
SQLiteの全文検索拡張機能(FTS5)は魅力的だ。データと同じファイル内に存在し、ライセンス費用がかからず、正確なトークン一致に対しては即座に結果を返す。しかし、プラットフォームのログを確認すると、ユーザーの検索の1割以上が全く結果を返していないことが判明した。「intersteller」や「avengrs endgame」といった、モバイルキーボードで起こりがちなスペルミスが主な原因だった。
トライグラム(3文字の断片)を用いた簡易的な対策により、検索結果ゼロの割合は7%まで低下したが、2つの問題が発生した。第一に、インデックスのサイズが元の3倍以上に膨れ上がり、ストレージコストの増大と更新速度の低下を招いた。第二に、関連性(relevance)が損なわれた。曖昧な一致(fuzzy matching)によって無関係な動画が混ざり、ユーザーを導くどころか混乱させてしまった。
チームは、ネイティブなタイポ許容(typo-tolerance)機能と高度な関連性スコアリングを備えた、検索専用のエンジンが必要であるとの結論に達した。
OpenSearchパイプラインの構築
SQLiteを「信頼できる唯一の情報源(source of truth)」として維持する
OpenSearchは、使い捨て可能な読み取り専用のレプリカとして機能させた。すべての動画メタデータはSQLiteに保持されるため、検索インデックスはデータ損失のリスクなしに再構築が可能である。OpenSearchクラスターがダウンした場合は、アプリケーションが自動的に元のFTS5エンジンへとフォールバックする仕組みになっている。
「should」クエリによる関連性の階層化
曖昧な一致だけに頼るのではなく、クエリを以下の3つの句(clause)で組み合わせた:
- 完全一致(Exact phrase match) – 最も高いブーストを適用し、タイトルを正しく入力したユーザーを優遇する。
- 全単語の存在(All terms present) – 中程度のブーストを適用し、すべての単語が含まれているが順序が必ずしも一致しないクエリを捕捉する。
- 曖昧一致(Fuzzy match) – 低いブーストを適用し、スペルミスしたトークンのためのセーフティネットとして機能させる。
この階層構造により、正確なクエリに対する精度を維持しつつ、タイポに対しても寛容なフォールバックを提供することが可能になった。
ファジー設定のチューニング
プレフィックス長(prefix length)を1に設定することで、曖昧なロジックが適用される前に、各単語の最初の1文字が一致することを強制した。このルールにより、検索速度を維持し、メモリを過負荷にする可能性のある候補単語の爆発的な増加を防いだ。また、チームは単語展開(term expansions)の最大数にも制限を設け、リソースの過剰消費に対するもう一つのガードレールとした。
同期戦略
OpenSearchインデックスをSQLiteと一致させるために、3つの補完的なプロセスを運用している:
- 新規データを同期するcronジョブ
- 夜間の差分チェック(Nightly diff pass) – 増分更新で漏れた不一致をスキャンする。
- 週次のフル再構築 – インデックスエイリアスの背後で実行し、単一の操作でエイリアスを切り替えることで、ダウンタイム・ゼロを保証する。
2週間後の測定可能なインパクト
- 検索結果ゼロのクエリが12%から1.4%に減少。
- 検索からクリックへの転換率が9%向上。
- 中央値レイテンシは28ms未満を維持し、プラットフォームのユーザー体験目標を十分に達成。
注意点と反論
この移行は、単に導入すれば済むようなアップグレードではない。チームは、プライマリデータベースを検索エンジンに置き換えてはならないと強調している。すべての動画メタデータの権威ある保存先(authoritative store)は、引き続きSQLiteである。
結論
検索専用エンジンを通じてタイポ許容機能を追加したことで、ユーザー体験における明らかな行き止まりが、スムーズで高速な体験へと変わった。このケーススタディは、リレーショナル・ストアを信頼できる唯一の情報源として維持し、関連性を階層化し、曖昧なロジックを保護するという規律あるアーキテクチャが、安定性を犠牲にすることなく測定可能な利益をもたらすことを示している。