Spanner の検索インデックスは、テキストのインデックス付けに加えて、JSON ドキュメントと JSONB ドキュメントをインデックスに登録してクエリする効率的な方法として利用できます。検索インデックスは、スタンドアロンの JSON クエリと JSONB クエリに使用したり、他の全文検索クエリを拡張したりします。
詳細については、JSON データをインデックスに登録するとJSONB データをインデックスに登録するをご覧ください。
JSON と JSONB をトークン化する
TOKENIZE_JSON
関数を使用して GoogleSQL で JSON インデックスを作成できます。あるいは、TOKENIZE_JSONB
関数を使用して PostgreSQL で JSONB インデックスを作成することも可能です。詳しくは、TOKENIZE_JSON
と TOKENIZE_JSONB
をご覧ください。
JSON クエリと JSONB クエリ
検索インデックスを使用すると、JSON の包含条件とキーの存在条件を含むクエリを高速化できます。JSON の包含は、ある JSON ドキュメントが別の JSON ドキュメントに含まれているかどうかを判定します。キーの存在は、そのキーがデータベース スキーマ内に存在するかどうかを判定します。
GoogleSQL の場合:
JSON_CONTAINS
関数を使用して、スキーマで JSON の包含を表現します。- フィールド アクセス、配列サブスクライバー演算子、
IS NOT NULL
を使用して、鍵の存在条件を構築します。フィールド アクセス演算子と配列添字演算子は、JSON ドキュメントのパスを表します。IS NOT NULL
は、そのパスが存在するかどうかを確認します(doc.sub.path[@index].key IS NOT NULL
など)。
PostgreSQL の場合:
クエリでは、検索インデックスに任意のタイプの複数の JSON 条件を指定することができます。JSON 条件を、AND
、OR
、NOT
を使った論理的な組み合わせで指定することも可能です。
検索インデックスの使用状況を確認する
クエリで検索インデックスが使用されていることを確認するには、クエリ実行プランで検索インデックス スキャン ノードを確認します。
制限事項
- 検索インデックス(JSON および JSONB の検索インデックスを含む)は、読み取り専用トランザクションでのみ使用されます。Spanner は、読み取り / 書き込みトランザクションで関連するセカンダリ インデックスを使用する場合があります。読み取り / 書き込みトランザクションで検索インデックスの使用を強制しようとすると、次のエラーが発生します。
ERROR: spanner: code = "InvalidArgument", desc = "The search index AlbumsIndex cannot be used in transactional queries by default."
- 特定の大規模な、あるいは非常に複雑な JSON ドキュメントを検索インデックスに保存しようとすると、
too many search token bytes
エラーが返されることがあります。この JSON ドキュメントの出力トークンのサイズは 10 MB 未満である必要があります。ドキュメント全体を検索する必要がない場合は、ドキュメントの小さなサブセットを抽出して(生成された列を使用するなど)、その列を検索することを検討してください。
次のステップ
- トークン化とトークン化ツールについて学習する。
- 検索インデックスについて学習する。
- JSON データのインデックス作成について学習する。
- JSONB データのインデックス作成について学習する。