Spanner 支持未分区和分区 搜索索引。 本页面介绍了如何在 Google Cloud 控制台中创建分区搜索索引, Spanner。
概览
如果在索引定义中省略 PARTITION BY
子句,则会创建非分区索引。在未分区索引中,查询需要从
所有索引拆分项。这会限制全文搜索查询的潜在可伸缩性。
而分区索引则会将索引细分为更小的单元,
每个唯一分区对应一个映像查询只能在单个分区内进行搜索
由 WHERE
子句中的等式条件指定。查询
针对分区索引进行的查询通常比针对
未分区索引,因为 Spanner 只需读取一个
单个分区。
搜索索引的分区类似于次级索引的键前缀。
例如,假设数据库中有 1,000,000 个 SingerIds
,并且有以下两个索引:
CREATE TABLE Albums (
AlbumId STRING(MAX) NOT NULL,
SingerId STRING(MAX) NOT NULL,
ReleaseTimestamp INT64 NOT NULL,
AlbumTitle STRING(MAX),
AlbumTitle_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(AlbumTitle)) HIDDEN,
SingerId_Tokens TOKENLIST AS (TOKEN(SingerId)) HIDDEN
) PRIMARY KEY(SingerId, AlbumId);
CREATE SEARCH INDEX AlbumsUnpartitionedIndex
ON Albums(AlbumTitle_Tokens, SingerId_Tokens);
CREATE SEARCH INDEX AlbumsIndexBySingerId
ON Albums(AlbumTitle_Tokens)
PARTITION BY SingerId;
以下查询选择了 AlbumsIndexBySingerId
索引,因为它只搜索单个歌手的数据。此类查询通常会使用较少的资源。
SELECT AlbumId
FROM Albums
WHERE SingerId = "singer1"
AND SEARCH(AlbumTitle_Tokens, 'happy')
您还可以强制查询使用 AlbumsUnpartitionedIndex
返回相同的结果。不过,这种方式会使用更多资源,因为查询需要访问所有索引分块,并过滤所有歌手的所有专辑,才能找到令牌“happy”,而不是仅过滤与歌手 singer1
对应的分块。
不过,有时应用需要搜索所有专辑,而不是特定歌手的专辑。在这些情况下, 使用未分区索引:
SELECT AlbumId
FROM Albums
WHERE SEARCH(AlbumTitle_Tokens, 'piano concerto 1')
一般建议是使用最精细的分区粒度 且适合查询的过滤条件例如,如果应用 查询电子邮件邮箱,其中每个查询都被限制在特定邮箱; 对邮箱 ID 的搜索索引进行分区。但是,如果查询 需要搜索所有邮箱,则更适合使用未分区索引。
某些应用可能需要采用多种分区策略来满足其特定的搜索要求。例如,广告资源 管理系统可能需要支持按产品类型或 制造商。此外,有些应用可能需要多个 Presort,如 例如按创建或修改时间排序在这些情况下,建议您创建多个搜索索引,每个索引都针对相应的查询进行优化。
后续步骤
- 了解标记化和 Spanner 标记生成器。
- 了解搜索索引。
- 了解数字索引。