全文検索の概要

このページでは、全文検索の概要とその仕組みについて説明します。

全文検索を使用すると、構造化フィールドの完全一致検索だけでなく、テーブル内で単語、フレーズ、数値を検索できるアプリケーションを構築できます。全文検索では、トランザクション整合性のある最新の commit 済みデータがアプリケーションに返されます。Spanner の全文検索機能には、検索語句の入力のスペル修正や言語の自動検出、検索結果のランク付けなども備わっています。Spanner は、近似語句の一致が含まれるようにテキスト検索を自動的に拡張します。

全文検索で使用できるようにする列に対し、検索インデックスを作成できます。Spanner はこれらの列のデータの分析を行い、検索インデックスに追加する個々の単語を特定します。データベースで commit されると、Spanner はすぐに検索インデックスを新しいデータまたは変更されたデータで更新します。

  • 基本的なテキスト検索: 単語またはフレーズ全体または一部を使用してコンテンツを検索し、信頼性の高い結果を取得します。クエリ述語の例として、次のようなものがあります。
    • すべての単語が一致する [tricolor rat terrier]
    • 語順も含め完全一致 ["rat terrier"]
    • 次のいずれかのキーワード [miniature OR standard]
    • 近接する単語 [world AROUND(3) cup]
    • 部分文字列 [start*]
  • 数値検索: 数値の等価性と不等性についての検索を行います。等価性の検索では、数値を照合します。範囲と不等性の検索では、特定の範囲内の数値を照合します。
  • n-gram ベースの検索: 固有名詞や名前など、スペルが異なる単語が一致と見なされます。このタイプの検索は、名前のスペルミス、異なるスペルがある名前、スペルが異なるテキストとクエリテキストを照合する場合にも役立ちます。
  • Soundex 検索: 発音が似ている単語を照合します。

全文検索機能

Spanner の全文検索には次の機能があります。

  • ランク付けされた検索結果: スコアを計算して、クエリがドキュメントにどれだけ一致しているかを測定します(column_A に重み付けを加えるなど)。SQL 式を使用してランキングをカスタマイズします。
  • スニペット: 検索結果内の一致するテキストがハイライト表示されます。
  • グローバル サポート: CJK セグメンテーションなど、さまざまな言語でのトークン化を自動的にサポートします。言語を手動で指定すると、追加で微調整することができます。
  • ガバナンス: 特定の単語が現れるすべての箇所を見つけます。
  • スペル修正: クエリ内の誤字脱字を自動的に修正し、ストレージ内の正しいスペルの単語と一致させます。たとえば、ユーザーが「girafe」を検索すると、「giraffe」を含むドキュメントが検索されます。
  • コンテキストに応じた類義語(ストップワードを含む)を追加: コンテキストに関連する類義語を自動的に追加して、検索の網羅性を高めます。たとえば、「家」は「この家」に、「猫の写真」は「子猫の写真」に一致します。
  • テキストとの間のコンテキストに応じて数値を変換: 数値のテキスト形式と数値表現を照合します。たとえば、「five cats」が「5 cats」と一致します。
  • 複数形への自動変換: 「cat」は「cats」に一致します。

全文検索のコンセプト

全文検索の主なコンセプトは次のとおりです。

  • ドキュメントとは、特定の行内の検索可能なデータを指します。
  • トークンとは、検索インデックスに保存されているドキュメントの各単語を指します。
  • トークン化プロセスとは、ドキュメントをトークンに分割するプロセスです。
  • トークン化に使用される SQL 関数を、トークン化ツールといいます。
  • 逆索引には、トークンが格納されます。SQL クエリを使用して転置インデックスを検索します。

全文検索を理解するために、データベースを使用して歌手ごとに曲を保存するアプリケーションについて見てみましょう。各行には 1 つの曲が含まれています。各曲には、タイトル、歌詞、歌手、アルバムなどの列があります。このアプリケーションは、全文検索を使用して、ユーザーが自然言語クエリを使用して曲を検索できるようにします。

  • 検索では、Prince OR Camille などの OR 演算子を使用するクエリがサポートされます。アプリケーションは、エンドユーザーの入力を検索ボックスから SQL の SEARCH 関数に直接フィードできます(クエリ構文を使用)。詳細については、検索インデックスをクエリするをご覧ください。
  • 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 で全文検索を行うには、次を行う必要があります。

  1. Spanner トークン化関数(TOKENIZE_SUBSTRING など)を使用して、ドキュメントをトークン化します。詳細については、トークン化をご覧ください。
  2. CREATE SEARCH INDEX DDL ステートメントを使用して、トークンを保持する検索インデックスを作成します。詳細については、検索インデックスをご覧ください。
  3. Spanner の SEARCH 関数を使用して、検索インデックス内のドキュメントをクエリします。詳細については、クエリの概要をご覧ください。
  4. Spanner の SCORE 関数を使用して、クエリの結果をランク付けします。詳細については、検索結果をランク付けするをご覧ください。

制限事項

料金

全文検索を使用する場合、Spanner からの追加料金は発生しませんが、実装することによりコンピューティング リソースとストレージ リソースの追加が必要になるため、費用が増加します。

詳細については、Spanner の料金をご覧ください。

次のステップ