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 文档是否包含在另一个文档中。键存在性用于确定数据库架构中是否存在相应键。

  • 在 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 文档的输出 token 大小必须小于 10 MB。如果您不需要可搜索整个文档,请考虑提取文档的一小部分子集(例如使用一个生成列),然后改为搜索该列。

后续步骤