搜索索引可以为多个经过令牌化处理的列编制索引,从而提高对这些列的查询效率。这个 页面介绍了如何对多列执行搜索, 全文搜索。
执行多列搜索
搜索索引的结构可确保查询不需要分布式联接,从而确保查询的性能可预测。由于与基表行对应的所有令牌都位于同一分块上,因此可以避免分布式联接。
例如,请参考以下架构:
CREATE TABLE Albums (
AlbumId STRING(MAX) NOT NULL,
Title STRING(MAX),
Studio STRING(MAX),
Title_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(Title)) HIDDEN,
Studio_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(Studio)) HIDDEN
) PRIMARY KEY(AlbumId);
CREATE SEARCH INDEX AlbumsIndex ON Albums(Title_Tokens, Studio_Tokens);
现在,一个查询可以同时搜索这两个字段:
SELECT AlbumId
FROM Albums
WHERE SEARCH(Title_Tokens, "fifth symphony")
AND SEARCH(Studio_Tokens, "Blue Note Studio")
Spanner 支持结合使用多列搜索查询,
WHERE
子句中的析取运算和否定运算符。您可以使用
以下类型的查询带有搜索索引:
连词:查找
Title
包含字词“car”的文档和Studio
包含“太阳”一词。SELECT AlbumId FROM Albums WHERE SEARCH(Title_Tokens, 'car') AND SEARCH(Studio_Tokens, 'sun')
析取:查找
Title
包含字词“car”的文档或Studio
包含字词“太阳”SELECT AlbumId FROM Albums WHERE SEARCH(Title_Tokens, 'car') OR SEARCH(Studio_Tokens, 'sun')
否定:查找
Title
不包含“car”一词的所有文档。SELECT AlbumId FROM Albums WHERE NOT SEARCH(Title_Tokens, 'car')
rquery 语言 可以执行相同类型的搜索:
SELECT AlbumId FROM Albums WHERE SEARCH(Title_Tokens, '-car')
这两种表单都会过滤
Title
为 NULL 的文档。标记化和 搜索功能被定义为对 NULL 输入返回 NULL。SQL 定义了 NOT NULL as NULL.
此外,您可以多次引用同一 TOKENLIST
列。
SELECT AlbumId
FROM Albums
WHERE (SEARCH(Title_Tokens, 'car') OR SEARCH(Studio_Tokens, 'sun'))
AND (SEARCH(Title_Tokens, 'guy') OR SEARCH(Studio_Tokens, electric))
您可以使用 rquery 语言或 SQL 在同一列中搜索多个字词。建议使用 rquery,因为它可以高效地对参数化查询进行缓存。除了查询缓存命中率提高之外, rquery 和 SQL 语言的延迟和性能率相同。
SELECT AlbumId
FROM Albums
WHERE SEARCH(Title_Tokens, 'car OR guy')
SELECT AlbumId
FROM Albums
WHERE SEARCH(Title_Tokens, 'car') OR SEARCH(Title_Tokens, 'guy')
您可以使用全文使用搜索索引加速的非文本条件 搜索功能。
后续步骤
- 了解全文搜索查询。
- 了解如何对搜索结果进行排名。
- 了解如何执行子字符串搜索。
- 了解如何对搜索结果进行分页。
- 了解如何混合使用全文查询和非文本查询。