执行子字符串搜索

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

概览

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

  • 不区分大小写,去除大部分标点,并将空格标准化。
  • 由于使用部分 CJK 查询,因此无法使用中文、日语和韩语 (CJK) 细分 往往是不正确的细分。
  • 对于多个搜索字词,结果中必须包含每个搜索字词的子字符串 条款。例如,'happ momen'"happy moment" 匹配,因为两者 子字符串。它与 "happy day" 不匹配。

示例

存储的文本 子字符串查询 匹配
Bridge over Troubled Water 里奇·鲁布
Bridge over Troubled Water 里奇、鲁布
横跨困境的桥梁 over brid
横跨困境的桥梁 阿特布里奇
Bridge over Troubled Water Bridge bridge bridge
横跨困境的桥梁 Bri trou ter
横跨困境的桥梁 Bridge
Bridge over Troubled Water troubledwater
横跨困境的桥梁 已拖动

对于子字符串搜索,请在 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-grams 并将这些 n-gram 存储在搜索索引中。要生成的 n 元语的最小长度和最大长度是通过可选参数配置的。

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

TOKENIZE_FULLTEXT类似, 您可以将 TOKENIZE_SUBSTRING 配置为使用特定类型的内容。

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

要启用相对搜索模式,请将 TOKENIZE_SUBSTRING relative_search_types 参数设为 TRUE。

在标记化中启用相对搜索后,SEARCH_SUBSTRING 可以执行 具有以下相对搜索类型的查询:

  • value_prefix:匹配连续的子字符串,并且匹配必须从值的开头开始。这在概念上类似于用于大小写和空格规范化字符串的 STARTS_WITH 函数。

    示例

    存储的文本 子字符串查询 匹配
    横跨困境的桥梁
    Bridge over Troubled Water 桥梁 ,超过
    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 Troub Water
    横跨困境的桥梁 水上
    Bridge over Troubled Water ove troubled
    Bridge over Troubled Water 陷入困境
  • word_suffix:与 value_suffix 类似,但字符串必须与词组边界末尾匹配。

    示例

    存储的文本 子字符串查询 匹配
    Bridge over Troubled Water 陷入困境
    横跨困境的桥梁 烦恼
    横跨困境的桥梁 水上
    Bridge over Troubled Water ove troubled

后续步骤