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 の包含は、1 つの JSON ドキュメントが別の JSON ドキュメントに含まれているかどうかを決定します。キーの存在は、データベース スキーマにキーが存在するかどうかを決定します。
GoogleSQL の場合:
JSON_CONTAINS
関数を使用して、スキーマで JSON の包含を表現します。- フィールド アクセス、配列サブスクライバー演算子、
IS NOT NULL
を使用して、鍵の存在条件を構築します。フィールド アクセス演算子と配列添字演算子は、JSON ドキュメント パスを記述します。IS NOT NULL
は、このパス(doc.sub.path[@index].key IS NOT NULL
など)が存在するかどうかを確認します。
PostgreSQL の場合:
クエリでは、検索インデックスに任意のタイプの複数の JSON 条件を含めることができます。AND
、OR
、NOT
を使用して、JSON 条件を論理結合で含めることもできます。
検索インデックスの使用状況を確認する
クエリで検索インデックスが使用されていることを確認するには、クエリ実行プランで検索インデックス スキャン ノードを確認します。
制限事項
- JSON 検索インデックスや JSONB 検索インデックスなどの検索インデックスは、読み取り専用トランザクションでのみ使用されます。Spanner は、読み取り / 書き込みトランザクションで関連するセカンダリ インデックスを使用する場合があります。読み取り / 書き込みトランザクションで検索インデックスの使用を強制しようとすると、次のエラーが発生します。
ERROR: spanner: code = "InvalidArgument", desc = "The search index AlbumsIndex cannot be used in transactional queries by default."
- 特定の大規模な JSON ドキュメントや非常に複雑な JSON ドキュメントを検索インデックスに保存しようとすると、
too many search token bytes
エラーが返されることがあります。この JSON ドキュメントの出力トークンのサイズは 10 MB 未満である必要があります。ドキュメント全体を検索する必要がない場合は、ドキュメントの小さなサブセットを抽出して(生成された列を使用するなど)、その列を検索することを検討してください。
次のステップ
- トークン化とトークン化ツールについて学習する。
- 検索インデックスについて学習する。
- JSON データのインデックス作成について学習する。
- JSONB データのインデックス作成について学習する。