このページでは、全文検索の概要と仕組みについて説明します。
全文検索を使用すると、構造化フィールドの完全一致検索だけでなく、テーブル内で単語、フレーズ、数値を検索できるアプリケーションを構築できます。全文検索では、トランザクション整合性のある最新の commit データがアプリケーションに返されます。Spanner の全文検索機能には、検索語句の入力のスペル修正や言語の自動検出、検索結果のランク付けなども備わっています。Spanner は、テキスト検索を自動的に拡張して、近似語句の一致を含めます。
全文検索で使用できるようにする列に検索インデックスを作成する必要があります。Spanner は、これらの列のデータの分析を行い、検索インデックスに追加する個々の単語を特定します。Spanner は、データベースに commit されるとすぐに、新しいデータまたは変更されたデータで検索インデックスを更新します。
全文検索の種類
- 基本的なテキスト検索: 単語またはフレーズ全体または一部を使用してコンテンツを検索し、信頼性の高い結果を取得します。クエリ述語の例:
- すべての単語が一致する [tricolor rat terrier]
- 語順も含め完全一致 ["rat terrier"]
- 次のいずれかのキーワード [miniature OR standard]
- 近接する単語 [world AROUND(3) cup]
- 部分文字列 [開始*]
- 数値検索: 数値の等式と不等式の検索を行います。等価検索は数値と一致します。範囲と不等式の検索では、特定の範囲内の数値が一致します。
- n-gram ベースの検索: 固有名詞や名前など、スペルが異なる単語が一致と見なされます。このタイプの検索は、スペルミスのある名前、スペルが異なる名前、スペルが異なるテキストとクエリテキストを照合する場合にも役立ちます。
- Soundex 検索: 発音が似ている単語を照合します。
全文検索機能
Spanner の全文検索には次の機能があります。
- ランク付けされた検索結果: スコアを計算して、クエリがドキュメントとどの程度一致しているかを測定します(column_A に重み付けを適用するなど)。SQL 式を使用してランキングをカスタマイズします。
- スニペット: 検索結果内の一致するテキストがハイライト表示されます。
- グローバル サポート: CJK セグメンテーションなど、さまざまな言語でのトークン化を自動的にサポートします。言語を手動で指定すると、追加の微調整を行うことができます。
- ガバナンス: 特定の単語がどこにでも使用されているかどうかを検出します。
- スペル修正: クエリ内のスペルミスを自動的に修正し、ストレージ内の正しいスペルの単語と一致させます。たとえば、ユーザーが「girafe」を検索すると、「girafe」を含むドキュメントが検索されます。
- コンテキストに応じた類義語の追加(ストップワードを含む): コンテキストに関連する類義語が自動的に追加され、レファレンス率が向上します。たとえば、「家」は「この家」に一致します。「猫の写真」は「子猫の写真」に一致します。
- テキストとの間でのコンテキストに応じた数値変換: 数値のテキスト形式と数値表現を照合します。たとえば、「5 匹の猫」は「5 匹の猫」に一致します。
- 複数形への自動変換: 「cat」を「cats」にマッチングします。
全文検索のコンセプト
全文検索の主なコンセプトは次のとおりです。
- ドキュメントは、特定の行内の検索可能なデータのことです。
- トークンとは、検索インデックスに保存されているドキュメントの各単語を指します。
- トークン化プロセスは、ドキュメントをトークンに分割します。
- トークン化に使用される SQL 関数をトークン化ツールといいます。
- 反転インデックスにはトークンが保存されます。SQL クエリを使用して転置インデックスを検索します。
全文検索のユースケースの例
全文検索を理解するために、データベースを使用して歌手ごとに曲を保存するアプリケーションについて説明します。各行は 1 つの曲です。各曲には、タイトル、歌詞、歌手、アルバムなどの列があります。このアプリケーションは、全文検索を使用して、ユーザーが自然言語クエリを使用して曲を検索できるようにします。
- 検索では、
Prince OR Camille
などのOR
演算子を使用するクエリがサポートされています。アプリケーションは、クエリ構文を使用して、検索ボックスからエンドユーザーの入力を SQLSEARCH
関数に直接フィードできます。 - Spanner は検索インデックスを使用して、さまざまなフィールドにわたって一致するドキュメントを検索します。たとえば、アプリケーションは、件名に「cry」が含まれ、歌詞に「so cold」が含まれ、歌手が「Prince」である曲を検索するクエリを実行できます。
検索インデックスのその他の用途
検索インデックスは、次のような全文検索以外にもさまざまな用途があります。
配列列の要素のインデックス付け。配列列を使用してアイテムに関連付けられたタグを保存するアプリケーションについて考えてみましょう。検索インデックスを使用すると、アプリケーションは特定のタグを含む行を効率的に検索できます。詳細については、配列のトークン化をご覧ください。
クエリ条件のセットの交差点にあるデータを検索する。たとえば、任意の属性セット(色、サイズ、ブランド、評価など)を使用して、カタログ内の商品を検索できます。
数値検索条件を単独で使用するか、全文検索条件と組み合わせて使用します。数値検索で検索インデックスが役立つ場合の例を次に示します。
- 全文検索アプリケーションと組み合わせた場合。たとえば、件名が「Picture」でサイズが 1 MB を超えるメールを検索するには、次のようにします。
- 前述の条件の交差の一部である場合。たとえば、
color = "yellow" AND size = 14 AND rating >= 4.5
の商品を見つけるには次のようにします。 - 数値列の交差点を検索する場合。たとえば、イベントの開始時間と終了時間を格納するテーブルを検討します。検索インデックスでは、特定の時点(
start_time <= @p AND end_time > @p
)に発生したイベントを検索するクエリを効率的に実装できます。
詳細については、数値インデックスをご覧ください。
全文検索の手順
Spanner で全文検索を行うには、次の手順が必要です。
- Spanner トークン化関数(
TOKENIZE_SUBSTRING
など)を使用してドキュメントをトークン化します。詳細については、トークン化をご覧ください。 CREATE SEARCH INDEX
DDL ステートメントを使用して、トークンを保持する検索インデックスを作成します。詳細については、検索インデックスをご覧ください。- Spanner の
SEARCH
関数を使用して、検索インデックス内のドキュメントをクエリします。詳細については、クエリの概要をご覧ください。 - Spanner の
SCORE
関数を使用して、クエリの結果をランク付けします。詳細については、検索結果をランク付けするをご覧ください。
制限事項
- 全文検索は Assured Workloads をサポートしていません。
料金
全文検索を使用する場合、Spanner から追加料金は発生しませんが、全文検索を実装すると、コンピューティング リソースとストレージ リソースの追加が必要になるため、費用が増加します。
詳細については、Spanner の料金をご覧ください。
次のステップ
- トークン化と Spanner トークン化ツールについて学習する。
- 検索インデックスについて学習する。
- 全文検索クエリについて学習する。