【ITニュース解説】Beyond Keywords: Hybrid Search With Atlas and Vector Search (Part 3)
2025年09月17日に「Dev.to」が公開したITニュース「Beyond Keywords: Hybrid Search With Atlas and Vector Search (Part 3)」について初心者にもわかりやすく解説しています。
ITニュース概要
記事は、キーワードが一致するフルテキスト検索と、意味を理解するベクトル検索の特性を解説。MongoDB Atlasの$rankFusionで両者を組み合わせる「ハイブリッド検索」をJavaで実装し、ユーザーの意図を正確に捉え、最適な検索結果を得る方法を示す。
ITニュース解説
映画検索アプリを例に、キーワード検索と意味検索を組み合わせた「ハイブリッド検索」という、より賢い検索機能の実現方法について解説する。これまでの取り組みでは、単なるキーワードだけでなく、文章の意味を理解する「意味検索」(ベクトル検索)を導入し、さらにフィルタリングやパフォーマンス最適化を進めてきた。しかし、ユーザーの検索意図は様々であり、一つの検索方法だけでは限界があることがわかってきた。
例えば、「氷山に衝突して夜沈む船」といった漠然とした説明で映画を探す場合、文章の意味を捉えるベクトル検索が「タイタニック」のような適切な結果を返す。一方、「タイタニック」のように具体的なタイトルで検索する場合、ベクトル検索は「ポセイドン」のような別の沈没船映画を返してしまうことがある。このような場合、タイトルそのものを正確に探し出す「フルテキスト検索」が瞬時に正しい結果を見つける。
つまり、フルテキスト検索は「正確なキーワードの一致」に強く、ベクトル検索は「文章全体の意味の理解」に優れている。それぞれに得意な領域があるため、どちらか一方に頼ると、ユーザーは求めている情報にたどり着けず、不満を感じてしまう可能性がある。
そこで登場するのが「ハイブリッド検索」である。これは、フルテキスト検索の正確さと、ベクトル検索の意味理解能力を組み合わせることで、ユーザーが入力した内容とその意図の両方を考慮した検索結果を提供する。MongoDB Atlasというデータベースサービスでは、このハイブリッド検索を実現するために「$rankFusion」という新しい機能が提供されている。$rankFusionは、複数の検索方法から得られた結果を一つに統合し、最終的な関連度に基づいて再ランキングする役割を担う。
フルテキスト検索を実装するには、まずデータベースに検索用のインデックスを作成する必要がある。このインデックスは、映画のタイトルやあらすじといったフィールドにどのようなキーワードが含まれるかを記録する。インデックスができてしまえば、指定したキーワードが含まれるドキュメント(ここでは映画の情報)を効率よく見つけられるようになる。 さらに、フルテキスト検索の使い勝手を向上させるための機能として、「あいまい検索(fuzzy search)」がある。これは、ユーザーがキーワードを間違って入力したり、スペルミスがあったりしても、ある程度の許容範囲で似たキーワードを見つけ出せるようにするものだ。例えば、「titani」と入力しても、「Titanic」を見つけられるようになる。また、「スコアブースティング(score boosting)」という機能を使えば、検索結果の関連度をさらに高められる。これは、映画のタイトルでの一致はあらすじでの一致よりも重要といった優先順位を設定し、それぞれのフィールドのマッチングが最終的なランキングに与える影響度を調整するものだ。これにより、ユーザーの意図により近い結果を上位に表示できる。
一方、ベクトル検索では、検索クエリ(「氷山に衝突して夜沈む船」のような文章)を「埋め込み(embedding)」と呼ばれる数値のベクトルに変換する。このベクトルは、文章の意味的な特徴を数学的に表現したものだ。そして、データベースに保存されている各映画のあらすじも同様にベクトル化されており、クエリのベクトルと映画のベクトルの「距離」を計算することで、意味的に近い映画を検索する。この際、年やジャンル、評価などの条件で結果を絞り込む「事前フィルタリング」も利用できる。
$rankFusionを使ってハイブリッド検索を構築する場合、フルテキスト検索の結果を生成する「searchPipeline」と、ベクトル検索の結果を生成する「vectorPipeline」という二つの独立した検索処理を用意する。そして、$rankFusionオペレーターでこれらのパイプラインを指定し、それぞれの結果をどのように組み合わせるかを「重み(weights)」で設定する。例えば、フルテキスト検索の重みを0.5、ベクトル検索の重みを0.5にすれば、両者の結果が等しく最終ランキングに影響する。
しかし、この重み付けはアプリケーションやユーザーの検索傾向によって最適な値が異なるため、実際に様々なクエリで試行錯誤し、最も良いユーザー体験が得られるバランスを見つける必要がある。
ハイブリッド検索を初めて試す際、一つ注意が必要な点がある。当初、ベクトル検索のパイプラインにのみフィルタ(例えば「1980年〜2003年の映画」)を適用していた場合、フルテキスト検索のパイプラインにはフィルタが適用されていないため、最終的なハイブリッド検索の結果に、フィルタ条件を満たさない映画が混じってしまう可能性がある。これを避けるためには、フルテキスト検索のパイプラインにも同じフィルタ条件を適用し、両方の検索方法が同じルールに基づいて結果を出すようにする必要がある。また、フィルタリングが正しく機能するように、データベースの検索インデックスの設定も適切に調整する必要がある。
さらに、特定のジャンルを除外したいといった「除外フィルタ」も実装できる。これは、指定された条件に合致しないドキュメントを結果から取り除く機能で、ユーザーのより複雑な検索ニーズに応えるために重要だ。
重みの調整は結果に大きく影響する。例えば、「氷山に衝突して夜沈む船」という記述的なクエリに対して、ベクトル検索の重みを高く設定(例えば0.8)し、フルテキスト検索の重みを低く設定(例えば0.2)すると、「タイタニック」のような意味的に関連性の高い映画が上位に表示されやすくなる。もしフルテキスト検索の重みが強すぎると、クエリ中の「夜」というキーワードと「A Knight’s Tale(騎士の物語)」の「Knight(騎士)」が似ていると判断され、意図しない映画が上位に来ることもある。
このシリーズを通じて、キーワードに留まらず、意味理解を取り入れた賢い検索アプリケーションを構築する方法を学んできた。最終的には、フルテキスト検索による正確なキーワードマッチングと、ベクトル検索による意味的な理解を組み合わせることで、両方の利点を享受できるハイブリッド検索の強力さが明らかになった。最適な検索設定は常にクエリやアプリケーションの目的によって異なるため、継続的な実験と調整が、ユーザーにとって最高の検索体験を提供するための鍵となる。