BigQuery での検索の概要

BigQuery 検索インデックスを使用することで、非構造化テキストや半構造化 JSON データに埋め込まれている一意のデータ要素を GoogleSQL を使って効率的に見つけることができます。テーブル スキーマを事前に把握しておく必要はありません。

検索インデックスによって、BigQuery では、強力なカラムストアとテキスト検索が 1 つのプラットフォームで提供され、データの行を個別に検出する必要がある場合に効率的に検索を行うことができます。一般的なユースケースとしてログの分析があります。たとえば、一般データ保護規則(GDPR)の報告用にユーザーに関連するデータ行を識別する、テキスト ペイロード内の特定のエラーコードを検索する、といったことができます。

BigQuery はインデックスを保存して管理するため、データが BigQuery で使用可能になると、SEARCH 関数またはその他の演算子と関数(equal(=)、INLIKE 演算子や特定の文字列関数と JSON 関数など)を使用してすぐに取得できます。検索を最適化するには、ベスト プラクティスをご覧ください。

ユースケース

BigQuery 検索インデックスは、次のタスクを行う際に役立ちます。

  • BigQuery テーブルに保存されているシステムログ、ネットワーク ログ、またはアプリケーション ログを検索する。
  • 規制を遵守するために削除するデータ要素を特定する。
  • デベロッパーのトラブルシューティングをサポートする。
  • セキュリティ監査を実施する。
  • 高度な検索フィルタを必要とするダッシュボードを作成する。
  • 前処理されたデータを完全一致で検索する。

詳細については、検索インデックスを作成するインデックスを使用した検索をご覧ください。

料金

組織内のインデックス付きテーブルの合計サイズがリージョンの上限を下回っている場合、検索インデックスの作成と更新に必要な処理に対する料金は発生しません。この上限を超えるインデックス登録をサポートするには、インデックス管理ジョブ用に独自の予約を指定する必要があります。検索インデックスがアクティブな場合、ストレージの費用が発生します。インデックスのストレージ サイズは INFORMATION_SCHEMA.SEARCH_INDEXES ビューで確認できます。

ロールと権限

検索インデックスを作成するには、インデックスを作成するテーブルに対する bigquery.tables.createIndex IAM 権限が必要です。検索インデックスを削除するには、bigquery.tables.deleteIndex 権限が必要です。次の IAM 事前定義ロールには、検索インデックスの操作に必要な権限が含まれています。

  • BigQuery データオーナー(roles/bigquery.dataOwner
  • BigQuery データ編集者(roles/bigquery.dataEditor
  • BigQuery 管理者(roles/bigquery.admin

制限事項

  • 検索インデックスをビューまたはマテリアライズド ビューに直接作成することはできませんが、インデックス付きテーブルのビューに対して SEARCH 関数を呼び出すと、基盤となる検索インデックスを使用できます。
  • 検索インデックスの作成後にテーブルの名前を変更すると、そのインデックスは無効になります。
  • SEARCH 関数は、ポイント検索用に設計されています。ファジー検索、タイプミスの修正、ワイルドカードなどのドキュメント検索は使用できません。
  • 検索インデックスのカバレッジが 100% でない場合にも、INFORMATION_SCHEMA.SEARCH_INDEXES ビューで報告されるすべてのインデックス ストレージに対して費用が発生します。
  • SEARCH 関数を含むクエリは、BigQuery BI Engine によって高速化されません。
  • DML ステートメントでインデックス付きテーブルが変更される場合、検索インデックスは使用されません。ただし、検索インデックスで最適化可能な述語が DML ステートメントのサブクエリに含まれている場合は使用できます。

    • 次のクエリでは検索インデックスは使用されません。
    DELETE FROM my_dataset.indexed_table
    WHERE SEARCH(user_id, '123');
    • 次のクエリでは検索インデックスを使用できます。
    DELETE FROM my_dataset.other_table
    WHERE
      user_id IN (
        SELECT user_id
        FROM my_dataset.indexed_table
        WHERE SEARCH(user_id, '123')
      );
  • クエリでマテリアライズド ビューを参照している場合、検索インデックスは使用されません。

  • 検索インデックスは、マルチステートメント トランザクション クエリでは使用されません。

次のステップ