除了将文本编入索引之外,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 文档是否包含在另一个文档中。键存在性用于确定数据库架构中是否存在相应键。
在 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 文档的输出 token 大小必须小于 10 MB。如果您不需要可搜索整个文档,请考虑提取文档的一小部分子集(例如使用一个生成列),然后改为搜索该列。
后续步骤
- 了解词元化和词元化器。
- 了解搜索索引。
- 了解如何将 JSON 数据编入索引。
- 了解如何将 JSONB 数据编入索引。