除了为文本编制索引之外,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 条件。您还可以使用 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 文档可能会返回
too many search token bytes
错误。此 JSON 文档中的输出令牌大小必须小于 10 MB。如果您不需要对整个文档进行搜索,不妨考虑提取文档的一小部分(例如,使用生成的列),然后改为对该列进行搜索。
后续步骤
- 了解令牌化和令牌化工具。
- 了解搜索索引。
- 了解如何为 JSON 数据编制索引。
- 了解如何为 JSONB 数据编制索引。