除了完全令牌匹配之外,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_min
和 ngram_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 否
后续步骤
- 了解全文搜索查询。
- 了解如何对搜索结果进行排名。
- 了解如何对搜索结果进行分页。
- 了解如何混合全文和非文本查询。
- 了解如何搜索多个列。