除了為文字建立索引,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 包含:判斷一個 JSON 文件是否包含在另一個文件中。
- 金鑰存在:判斷 JSON 文件中是否存在金鑰或路徑。
您可以在各方言中,以下列方式表示這些條件:
在 GoogleSQL 中:
- 在已建立索引的
JSON資料欄,或使用欄位存取和下標運算子擷取的子路徑上,使用=、!=、<>、IN和NOT IN運算子建構等式述詞。例如:doc = JSON '{"a": 1}'、doc.sub.path[0].key = "value"或doc.status IN ("active", "pending")。JSON 搜尋索引不會加速處理其他比較運算子,例如<、<=、>和>=。 - 使用
JSON_CONTAINS函式,在結構定義中表示 JSON 容器。 - 使用欄位存取、陣列下標運算子和
IS NOT NULL建構金鑰存在條件。欄位存取和陣列下標運算子會描述 JSON 文件路徑。IS NOT NULL會檢查這個路徑是否存在 (例如doc.sub.path[@index].key IS NOT NULL)。
- 在已建立索引的
在 PostgreSQL 中:
- 在已建立索引的
JSONB資料欄或使用->運算子擷取的子路徑上,使用=、!=、<>、IN和NOT IN運算子建構等式述詞。例如doc = '{"a": 1}'::jsonb、doc->'sub'->0->'key' = '"value"'::jsonb或doc->'status' IN ('"active"'::jsonb, '"pending"'::jsonb)。其他比較運算子 (例如<、<=、>和>=),以及使用->>的文字擷取述詞,都不會透過 JSONB 搜尋索引加速。 - 使用
@>和<@運算子表示 JSONB 包含關係。詳情請參閱「JSONB 運算子」。 - 使用
?、?|和?&運算子建構鍵存在條件。詳情請參閱「JSONB 運算子」。
- 在已建立索引的
您可以在查詢中加入搜尋索引中任何類型的多個 JSON 條件。您也可以使用 AND、OR 和 NOT,將 JSON 條件納入邏輯組合。
查看搜尋索引用量
如要確認查詢是否使用搜尋索引,請在查詢執行計畫中尋找「Search index scan」(搜尋索引掃描) 節點。
限制
- 搜尋索引 (包括 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 資料建立索引。