JSON 検索インデックス

Spanner の検索インデックスは、テキストのインデックス作成に加えて、JSON ドキュメントと JSONB ドキュメントのインデックス作成とクエリを効率的に行う方法として利用できます。検索インデックスは、スタンドアロンの JSON クエリと JSONB クエリに使用したり、他の全文検索クエリを拡張したりするために使用します。

詳細については、JSON データをインデックスに登録するJSONB データをインデックスに登録するをご覧ください。

JSON と JSONB をトークン化する

TOKENIZE_JSON 関数を使用して GoogleSQL で JSON インデックスを作成できます。また、TOKENIZE_JSONB 関数を使用して PostgreSQL で JSONB インデックスを作成することもできます。詳しくは、TOKENIZE_JSONTOKENIZE_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 の場合:

    • @> 演算子と <@ 演算子を使用して、JSONB の包含を表現します。詳細については、JSONB 演算子をご覧ください。
    • ??|?& 演算子を使用して、鍵の存在条件を構成します。詳細については、JSONB 演算子をご覧ください。

クエリでは、検索インデックスに任意のタイプの複数の JSON 条件を含めることができます。ANDORNOT を使用して、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 未満である必要があります。ドキュメント全体を検索する必要がない場合は、ドキュメントの小さなサブセットを抽出して(生成された列を使用するなど)、その列を検索することを検討してください。

次のステップ