除了将文本编入索引之外,搜索索引还提供了一种高效的方法来将数字编入索引。它主要用于通过数字字段的条件来增强全文搜索查询。本页面介绍了如何针对等式和不等式查询将数字编入索引,以及如何将数字数组编入索引。
对数字进行词元化处理
数字词元化器用于生成一组旨在加快数字比较搜索速度的 token。
使用 TOKENIZE_NUMBER
函数创建数字索引。TOKENIZE_NUMBER
支持这些类型的 INT64
、FLOAT32
、FLOAT64
或 ARRAY
。
对于 PostgreSQL,请使用 spanner.tokenize_number
函数创建数字索引。spanner.tokenize_number
仅支持 bigint
类型。
针对等式和不等式查询将数字编入索引
Spanner 支持针对等式和不等式将数字编入索引。等式搜索会匹配数字。范围搜索和不等式搜索会匹配特定范围内的数字。您可以在 TOKENIZE_NUMBER
comparison_type
参数中设置此值:
- 等式:
comparison_type=>"equality"
- 不等式和等式:
comparison_type=>"all"
在这两种情况下,原始数字(整数或浮点数)都需要经过一个词元化(在概念上与全文词元化类似)过程。它会生成一组 token,然后查询可以使用这些 token 来查找符合数字条件的文档。
等式索引只会生成一个表示该数字的 token。如果查询在 WHERE
子句中仅具有 field = @p
形式的条件,建议使用此模式。
不等式索引和等式索引可加快满足查询的 WHERE
子句中更广泛条件的速度。除了等式条件之外,还包括 field < @p
、field <= @p
、field > @p
、field >= @p
、field BETWEEN @p1 and @p2
和 field <> @p
。为了实现此类索引编制,Spanner 会在底层搜索索引中生成 token。Spanner 可以为每个编入索引的数字生成多个 token,具体取决于调优参数。token 数量取决于为 TOKENIZE_NUMBER
设置的参数,例如 algorithm
、min
、max
和 granularity
。因此,请务必仔细评估调优参数,以确保在磁盘存储空间和查找时间之间取得适当的平衡。
数组词元化
除了标量值之外,TOKENIZE_NUMBER
还支持对数字数组进行词元化处理。
将 TOKENIZE_NUMBER
与 ARRAY
列搭配使用时,您必须指定 comparison_type=>"equality"
。不支持使用数字数组进行范围查询。
CREATE TABLE Albums (
AlbumId STRING(MAX) NOT NULL,
Ratings ARRAY<INT64>,
Ratings_Tokens TOKENLIST
AS (TOKENIZE_NUMBER(Ratings, comparison_type=>"equality")) HIDDEN
) PRIMARY KEY(AlbumId);
CREATE SEARCH INDEX AlbumsIndex ON Albums(Ratings_Tokens);
以下查询会查找评分为 1 或 2 的所有专辑:
SELECT AlbumId
FROM Albums
WHERE ARRAY_INCLUDES_ANY(Ratings, [1, 2])
以下查询会查找评分为 1 和 5 的所有专辑:
SELECT AlbumId
FROM Albums
WHERE ARRAY_INCLUDES_ALL(Ratings, [1, 5])
后续步骤
- 了解词元化和 Spanner 词元化器。
- 了解搜索索引。
- 了解索引分区。