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 包含关系用于确定一个 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 文档可能会返回 too many search token bytes 错误。此 JSON 文档中的输出令牌大小必须小于 10 MB。如果您不需要对整个文档进行搜索,不妨考虑提取文档的一小部分(例如,使用生成的列),然后改为对该列进行搜索。

后续步骤