执行子字符串搜索

除了令牌完全匹配之外,Spanner 搜索索引还支持子字符串搜索。本页介绍了如何在 Spanner 中执行 全文搜索的子字符串搜索。

子字符串搜索具有以下特点:

  • 不区分大小写,会舍弃大多数标点符号,并对空格进行标准化处理。
  • 不进行中文、日文、韩文 (CJK) 细分,因为部分 CJK 查询通常会细分错误。
  • 对于多个搜索字词,结果必须包含每个字词的子字符串。例如,'happ momen'"happy moment" 匹配,因为文本中都包含这两个子字符串。它与 "happy day" 不匹配。

示例

存储的文本 子字符串查询 匹配
Bridge over Troubled Water ridg roub
Bridge over Troubled Water ridg , roub
Bridge over Troubled Water over brid
Bridge over Troubled Water ate 桥
Bridge over Troubled Water Bridge bridge bridge
Bridge over Troubled Water bri trou ter
Bridge over Troubled Water bri dge
Bridge over Troubled Water troubledwater
Bridge over Troubled Water trubled

对于子字符串搜索,请在 TOKENLIST 列定义中使用 TOKENIZE_SUBSTRING 函数,如以下 DDL 示例所示:

CREATE TABLE Albums (
  AlbumId STRING(MAX) NOT NULL,
  AlbumTitle STRING(MAX),
  AlbumTitle_Tokens TOKENLIST AS (TOKENIZE_SUBSTRING(AlbumTitle)) HIDDEN
) PRIMARY KEY(AlbumId);

在 SQL 查询中,请在 WHERE 子句中使用 SEARCH_SUBSTRING 函数。例如,以下查询会与上例中创建的表中的标题为“happy”的专辑匹配:

SELECT Album
FROM Albums
WHERE SEARCH_SUBSTRING(AlbumTitle_Tokens, 'happ');

TOKENIZE_SUBSTRING 会为每个令牌生成n 元语法,并将这些 n 元语法存储在搜索索引中。要生成的 n 元语的最小长度和最大长度是通过可选参数配置的。

与对同一数据使用全文索引相比,子字符串搜索索引的存储空间用量可能高出 10-30 倍,因为令牌化会产生更多令牌。如果 ngram_size_minngram_size_max 之间的差异较大,这一点尤其正确。子字符串查询在执行时也会使用更多资源。

TOKENIZE_FULLTEXT 一样,您可以配置 TOKENIZE_SUBSTRING 以使用特定类型的内容。

除了基本子字符串搜索之外,SEARCH_SUBSTRING 还支持相对搜索模式。相对搜索可优化子字符串搜索结果。

如需启用相对搜索模式,请将 TOKENIZE_SUBSTRINGrelative_search_types 参数设置为包含受支持相对搜索类型元素的非空数组。

在令牌化中启用相对搜索后,SEARCH_SUBSTRING 可以使用以下相对搜索类型执行查询:

  • phrase:匹配连续的子字符串

    示例

    存储的文本 子字符串查询。 匹配
    Bridge over Troubled Water
    Bridge over Troubled Water Bridge bridge bridge
    Bridge over Troubled Water 桥接
    Bridge over Troubled Water ridge over trouble
    Bridge over Troubled Water bridge ove troubled
    Bridge over Troubled Water idge ove
    Bridge over Troubled Water idge , ove
    Bridge over Troubled Water RIDGE OVE
    Bridge over Troubled Water 桥水
  • value_prefix:匹配连续的子字符串,并且匹配必须从值的开头开始。这在概念上类似于用于大小写和空格规范化字符串的 STARTS_WITH 函数。

    示例

    存储的文本 子字符串查询 匹配
    Bridge over Troubled Water
    Bridge over Troubled Water bridge , over
    Bridge over Troubled Water ridge over
    Bridge over Troubled Water 混乱的局面
  • value_suffix:匹配连续的子字符串,并且匹配必须在值的末尾。这在概念上类似于用于大小写和空格规范化字符串的 ENDS_WITH 函数。

    示例

    存储的文本 子字符串查询。 匹配
    Bridge over Troubled Water 混乱的局面
    Bridge over Troubled Water troubled ; water
    Bridge over Troubled Water 浑浊水
    Bridge over Troubled Water troubled wate
    Bridge over Troubled Water 麻烦水
    Bridge over Troubled Water
  • word_prefix:value_prefix 类似,但字符串必须在术语边界(而非值边界)处匹配。

    示例

    存储的文本 子字符串查询 匹配
    Bridge over Troubled Water over trouble
    Bridge over Troubled Water 结束了,麻烦
    Bridge over Troubled Water troub water
    Bridge over Troubled Water 水上
    Bridge over Troubled Water ove troubled
    Bridge over Troubled Water ver troubled
  • word_suffix:与 value_suffix 类似,但字符串必须与术语边界末尾匹配。

    示例

    存储的文本 子字符串查询 匹配
    Bridge over Troubled Water ver troubled
    Bridge over Troubled Water over trouble
    Bridge over Troubled Water 水上
    Bridge over Troubled Water ove troubled

后续步骤