業務データ、リアルタイム分析、AIワークロード——これまでバラバラだったものをひとつのデータベースに。OceanBase AI Database 詳細はこちら ->
業務データ、リアルタイム分析、AIワークロード——これまでバラバラだったものをひとつのデータベースに。OceanBase AI Database 詳細はこちら -> ->
AIアプリケーションの検索基盤では、ベクトルデータベース、リレーショナルデータベース、検索エンジンを組み合わせる構成がよく使われます。PoCの段階では合理的に見えるこの構成も、本番運用に入ると、データ同期の遅延、検索処理の複雑化、運用負荷の増大といった課題が顕在化します。
OceanBaseは、V4.4.1からハイブリッド検索をサポートしています。V4.6.0では、SQLから直接利用できるHYBRID_SEARCHインターフェースを追加しました。ベクトル検索、全文検索、スカラー値によるフィルタリングを1つのSQLに集約し、複数のシステムに分散していた検索処理をデータベース内で実行できます。
本記事では、RAG向けナレッジベースを例に、ハイブリッド検索が解決する課題と、その使い方、適したユースケースを解説します。
社内ナレッジベースに、次の4件のドキュメントがあるとします。
id | title | content | category |
|---|---|---|---|
| 1 | OceanBase 4.6.0の新機能 | 本バージョンではベクトル検索機能を追加。HNSWインデックスに対応… | リリース情報 |
| 2 | OceanBaseバージョン別機能一覧 | ベクトルインデックス:4.3系から対応。全文検索:4.3.1から対応… | クイックリファレンス |
| 3 | ベクトルインデックスの選び方 | HNSW、IVFなどのベクトルインデックスについて、用途と性能を比較… | ベストプラクティス |
| 4 | OceanBase 4.6.0へのアップグレードガイド | 4.5.xから4.6.0へのアップグレード手順。ベクトル検索機能に対応… | 運用ガイド |
※上記は検索方式の違いを説明するためのサンプルです。
ここで、ユーザーが**「OceanBaseベクトルインデックス」**と検索した場合を考えてみましょう。
このような場合、両者を組み合わせたハイブリッド検索なら、それぞれが見落としたドキュメントを補い、4件すべてを検索候補に含められます。
検索方式 | 取得するドキュメント | 取りこぼすドキュメント | 理由 |
|---|---|---|---|
| ベクトル検索(意味の類似性) | 1、3、4 | 2 | 一覧形式で説明が少なく、意味の類似性を捉えにくい |
| 全文検索(キーワードの一致) | 2、3 | 1、4 | 「ベクトル検索」という別の表現に一致しない |
| ハイブリッド検索 | 1、2、3、4 | — | 2つの検索方式が互いの取りこぼしを補う |
キーワード検索は表現の違いに弱く、意味にもとづく検索は、専門用語が一致するドキュメントを見落とすことがあります。両者を組み合わせることで、それぞれの弱点を補えます。
さらに、「ベストプラクティスに絞り込む」「著者の信頼度順に並べる」という条件を加えると、必要な処理は増えていきます。
authorsテーブルに保存されている場合は、テーブル間の**結合(JOIN)**も必要です。複数のシステムを組み合わせる場合、条件に合うIDをリレーショナルデータベースで取得し、検索時に指定する方法が考えられます。また、取得した検索結果をアプリケーション側で絞り込み、著者情報と照合する方法もあります。
いずれもシステム間の連携が必要になり、処理が複雑になります。クエリが増えることで応答時間が延び、データの更新タイミングの違いによって不整合が生じる可能性もあります。
ベクトルデータベースから上位20件、検索エンジンから上位20件を取得したとして、その後の処理はどうするのでしょうか。
アプリケーション側では、重複を取り除き、2つの検索結果を統合して、最終的な順位を決める必要があります。採用する方式によっては、スコアの正規化も必要です。
結果の統合によく使われるのが、**RRF(Reciprocal Rank Fusion)**です。各検索結果での順位をもとに、$1 / (\text{rank_constant} + \text{rank})$ で算出した値を加算し、最終的な順位を決めます。元のスコアを直接比較しないため、ベクトル距離とBM25スコアのように尺度が異なる検索結果も統合できます。
課題は、重複排除から結果の統合、並べ替えまでをアプリケーション側で実装し、保守しなければならないことです。コードと調整項目が増え、統合方法を変更するたびに再デプロイが必要になる場合もあります。
ベクトルデータベース、リレーショナルデータベース、検索エンジンを個別に運用すると、監視、バックアップ、スケーリング、セキュリティ設定も、それぞれに必要になります。
さらに、システム間のデータ連携には、CDC、ETL、メッセージキューなどを使った同期の仕組みが必要です。稼働状況を監視する対象も、バージョンアップ時に影響を確認する対象も増えていきます。
コンポーネントが増えるほど、運用対象だけでなく、障害が起こり得る箇所も増えます。
業務データベースで価格や公開状態、文書の内容を更新しても、その変更がベクトルデータや全文検索インデックスにすぐ反映されるとは限りません。
整合性を保つには、更新を各システムへ伝える同期パイプラインが必要です。そのパイプライン自体も、運用・監視の対象になります。
同期が遅れれば、販売を終了した商品が検索結果に表示されたり、古い価格が参照されたりします。RAGでは、更新前の情報をもとにAIが回答してしまう可能性もあります。
OceanBase V4.6.0のSQLインターフェースでは、ベクトル検索、全文検索、スカラーフィルタリングを組み合わせ、データベース内で実行できます。
OceanBaseでは、ベクトルデータも、テキストや数値と同じテーブルに保存できます。
たとえば、次の列を1つのテーブルに定義できます。
embedding VECTOR(1536)content TEXTprice DECIMALcategory VARCHARtags JSONこのテーブルに、用途に応じてベクトルインデックス、全文検索インデックス、検索インデックス(Search Index)を作成します。
検索には、HYBRID_SEARCH()を使います。ベクトル検索、全文検索、フィルタ条件、結果の統合方法をまとめて指定できます。
各指定の役割は、次のとおりです。
指定 | 役割 |
|---|---|
knn | embedding 列を対象に、クエリベクトルに近い上位10件を取得する |
query.bool.must | title 列を対象に、「データベース最適化」で全文検索する |
query.bool.filter | 全文検索の候補を、category = ベストプラクティス に絞り込む |
rank.rrf | ベクトル検索と全文検索の結果をRRFで統合する |
size | 統合後の検索結果から、上位10件を返す |
ベクトル検索にも同じカテゴリ条件を適用する場合は、knn.filterにも条件を指定します。
従来の構成では、ベクトルデータベースと検索エンジンの両方にリクエストを送り、結果をアプリケーションで統合する必要がありました。OceanBaseでは、データベースへの1回の問い合わせで、検索から結果の統合まで実行できます。
HYBRID_SEARCHでベクトル検索、全文検索、スカラーフィルタリングを組み合わせられます。RAGでは、ユーザーの質問に関連するドキュメントを検索し、LLMに渡します。
たとえば、ユーザーが**「OceanBaseの分散トランザクションは、どのように整合性を保証するのか」**と質問した場合を考えてみましょう。
代表的な処理の流れは、次のようになります。
OceanBaseでは、ベクトル検索と全文検索、検索対象の絞り込み、結果の統合と件数指定を1つのSQLにまとめられます。
titleとcontentの両方を全文検索の対象にする場合は、それぞれに全文検索インデックスを作成します。
ベクトル検索で表現の異なる関連ドキュメントを探し、全文検索で製品名や専門用語に一致するドキュメントを補います。両者の結果は、rank.rrfとknn.boostを使った重み付きRRF(WRRF)で統合できます。
パラメータは、たとえば次のように設定します。
k = 20 で候補を多めに取得する:ベクトル検索でまず20件を取得し、全文検索の結果と統合したうえで、最終的に上位5件に絞ります。boost = 1.5 でベクトル検索の重みを上げる:意味の近さを重視したい場合の設定例です。キーワードの完全一致が重要な用途では、実際の検索結果を見ながら重みを調整します。検索処理を1つのSQLにまとめても、用途に応じた調整は必要です。代表的な調整項目を以下に示します。
課題・目的 | 調整方法 | 期待できる効果 |
|---|---|---|
| 関連ドキュメントの取りこぼしが多い | knn.k を大きくする | 統合対象の候補が増え、再現率の改善につながる |
| キーワードが一致する結果を優先したい | 全文検索側の boost を上げる | キーワードに一致した結果が上位に入りやすくなる |
| 低スコアの結果を除外したい | min_score を設定する | 指定したスコアのしきい値で結果を絞り込める |
| 各検索で上位に入った結果を重視したい | rank_constant を小さくする(例:30) | 順位による重みの差が大きくなる |
| 順位による重みの差を小さくしたい | rank_constant を大きくする(例:100) | 下位の結果も最終順位に反映されやすくなる |
OceanBaseのハイブリッド検索は、特に次のような要件に適しています。
ベクトル検索だけを検証するPoCであれば、専用のベクトルデータベースも有効な選択肢です。ただし、本番利用が進むと、製品型番の完全一致、価格帯の指定、在庫の有無による絞り込みなど、自然言語の意味だけでは対応できない要件が増えていきます。
こうした要件を見据えると、ハイブリッド検索は検索品質の改善だけでなく、システム構成を考えるうえでも有力な選択肢になります。
OceanBaseは、V4.4.1のPLインターフェースに続き、V4.6.0でHYBRID_SEARCH()によるSQLインターフェースを提供しました。ベクトル検索と全文検索で取りこぼしを補い、検索処理を1つのSQLに集約し、検索用データと業務データを同じトランザクションで更新できます。
意味にもとづく検索とキーワード検索の両方が必要なAIアプリケーションでは、OceanBaseのハイブリッド検索を活用してみてください。

AIアプリ開発でデータ層が分散しやすくなる理由 RAGやAIエージェントを組み込んだアプリケーションを作ると、使うツールは自然と増えていきます。LangChainやLlamaIndexで処理フローを組み立て、OpenAIやローカルモデルで推論を行い、Difyのようなワークフロープラットフォームで業務ロジックをつなぎ、Cursor、Cline、Claude CodeなどのIDEで実装を進める。最近のAI開発では、こうした構成は珍しくありません。 一方で、ツールが増えるほどデータ層は複雑になりがちです。業務データはRDB、ベクトル検索は専用Vector DB、キーワード検索は検索エンジン、エージェ...


OceanBaseには、`AI_COMPLETE`、`AI_EMBED`、`AI_RERANK`、`AI_PROMPT`、`AI_SPLIT_DOCUMENT` という5つのSQL組み込み関数があります。これらを使うと、テキストのチャンキング、ベクトル化、検索結果の再ランキング、テキスト生成といった処理をデータベースの中で扱えます。ベクトル検索やハイブリッド検索と同じエンジン上で動くので、RAGの一連の流れをSQLでそのままつなげて書けます。 OceanBaseでは、LLMの機能をデータベース関数として利用できます。使い方は`UPPER()`や`SUM()`に近く、モデルのエンドポイントを登録...


OceanBaseは、分散データベースから出発し、いまではAI時代に対応する新たな製品群へと進化しつつあります。本記事では、その技術的な歩みをたどります。 OceanBaseの製品進化 OceanBaseは2010年に分散データベースの開発を開始しました。当初はNoSQLデータベースとして位置付けられていましたが、その後は本格的なリレーショナルデータベースへと進化し、MySQLおよびOracleとの互換性も継続的に強化してきました。3.x以降は、トランザクション処理(TP)と分析処理(AP)が混在するワークロードへの対応も強化してきました。実際の基幹業務システムでは、TPとAPを厳密に切り分け...
