検索システム
背景
Qudenの検索システムは、クリップに関連する様々な情報(タイトル、概要、コメント、ステップ内のテキストなど)を横断的に検索し、迅速に必要なクリップを見つけることを目的としています。将来的には、LLM(Large Language Models)の情報源としても活用されることを目指しています。
システム概要
このシステムは、MongoDB Atlas の検索機能である MongoDB Atlas Search を利用して実装されています。中心となるのは items コレクションで、必要な情報を集約したビューを Atlas 上に作成し、そこに検索用のインデックスを設定しています。この検索用ビューは、Atlas Triggers を用いて各コレクションの更新時にリアルタイムで同期され、常に最新の状態を保持しています。
システムアーキテクチャ
基本的には下図のようにMongo Atlas Search内の機能を利用して検索インデックスの構築・更新、検索クエリの解析、クエリ結果のスコアリングなどを行なっています
各コンポーネントの役割
- itemsSearchView collection
- クリップ検索を行うための Materialized view
- items コレクションを中心に、stepitems / comments などの情報が付加されている
- itemsSearchView SearchIndex
- 検索用のインデックス
- Atlas triggers
- items stepitems comments collection の変更をリアルタイムに検知し、Materialized viewを更新
- NestJS(backend)
- 検索ワードから
$searchクエリへ変換し、Atlas へクエリを投げる - 検索結果を整形し、フロントエンドに返す
- 検索ワードから
MaterializedView と検索インデックスの同期方法など内部の詳細を知りたい方は、MongoDB Atlas Search のアーキテクチャを参考
開発環境の設定
MongoDB Atlas Search は local DB では使用できないため、Atlas 上で検索インデックスの作成・クエリを行う必要があります。 local 環境で再現するためには toruca-backend-core/src/config/configuration.ts を変更するなどして、staging の Mongo を参照するようにしてください
デプロイメントプロセス
backend / frontend は通常通り
Atlas Triggers, Search Index は Mongo Atlas のコンソール上で管理しているので、そちらで編集してください (本当は Terraform で管理したいところ)
Materialized View の作成は Migration Batch を使って行っています。 初回のみ行えば良い作業なので、基本的には再作成しなくても良いですが、必要な場合は toruca-backend-core/scripts/batch/20231212-create-items-search-view.ts を編集 & 再実行してください。2023年12月時点では冪等性が担保されるようにしてあります。
