除了令牌完全匹配之外,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_min
和 ngram_size_max
之间的差异较大,这一点尤其正确。子字符串查询在执行时也会使用更多资源。
与 TOKENIZE_FULLTEXT
一样,您可以配置 TOKENIZE_SUBSTRING
以使用特定类型的内容。
启用相对子字符串搜索
除了基本子字符串搜索之外,SEARCH_SUBSTRING
还支持相对搜索模式。相对搜索可优化子字符串搜索结果。
如需启用相对搜索模式,请将 TOKENIZE_SUBSTRING
的 relative_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 否
后续步骤
- 了解全文搜索查询。
- 了解如何对搜索结果进行排名。
- 了解如何对搜索结果进行分页。
- 了解如何混合使用全文查询和非文本查询。
- 了解如何搜索多个列。