许多应用都会查询数据库,以在应用中填充单个页面。在此类应用中,应用并不需要 匹配,但根据索引排序顺序,只有前 k 个匹配项。搜索索引 可以非常有效地实施此类搜索。本页介绍了如何创建和搜索具有前 k 个匹配项的索引。
为前 k 个匹配项创建搜索索引
如需针对前 k 个匹配项配置搜索索引,请使用 ORDER BY
按特定列对搜索索引进行排序。查询需要有一个 ORDER BY
子句
与搜索索引排序顺序完全匹配(包括升序与
降序)和一个 LIMIT
子句(用于要求查询在之后停止)
找到 k-匹配行。
您还可以使用这些子句实现分页。如需了解详情,请参阅 对搜索查询进行分页。
对于某些用例,维护多个搜索索引可能很有意义 按不同的列排序。与分区一样,这需要在存储和写入费用与查询延迟时间之间进行权衡。
例如,假设某个表使用以下架构:
CREATE TABLE Albums (
AlbumId STRING(MAX) NOT NULL,
RecordTimestamp INT64 NOT NULL,
ReleaseTimestamp INT64 NOT NULL,
ListenTimestamp INT64 NOT NULL,
AlbumTitle STRING(MAX),
AlbumTitle_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(AlbumTitle)) HIDDEN
) PRIMARY KEY(AlbumId);
CREATE SEARCH INDEX AlbumsRecordTimestampIndex
ON Albums(AlbumTitle_Tokens, SingerId_Tokens)
ORDER BY RecordTimestamp DESC
STORING ListenTimestamp
CREATE SEARCH INDEX AlbumsReleaseTimestampIndex
ON Albums(AlbumTitle_Tokens)
ORDER BY ReleaseTimestamp DESC
STORING ListenTimestamp
查询前 k 个匹配项的搜索索引
如前所述,查询需要包含 ORDER BY
子句
与搜索索引排序顺序完全匹配(包括升序与
降序)和一个 LIMIT
子句(用于要求查询在之后停止)
找到 k-匹配行。
以下是一些常见的查询:
以下查询非常高效。它会选择
AlbumsRecordTimestampIndex
索引。即使有很多专辑带有 字词“happy”时,查询仅扫描少量行:SELECT AlbumId FROM Albums WHERE SEARCH(AlbumTitle_Tokens, 'happy') ORDER BY RecordTimestamp DESC LIMIT 10
同一查询,请求按
ReleaseTimestamp
降序排列 顺序,使用AlbumsReleaseTimestampIndex
索引, 效率:SELECT AlbumId FROM Albums WHERE SEARCH(AlbumTitle_Tokens, 'happy') ORDER BY ReleaseTimestamp DESC LIMIT 10
同时,请求按
ListenTimestamp
排序的查询无法高效执行前 k 个查询。它必须提取所有匹配的专辑,按ListenTimestamp,
对其进行排序,然后返回前 10 个专辑。这样的查询使用 如果存在大量文档包含该字词, “happy”。SELECT AlbumId FROM Albums WHERE SEARCH(AlbumTitle_Tokens, 'happy') ORDER BY ListenTimestamp DESC LIMIT 10`
同样,如果查询请求的结果是 使用
RecordTimestamp
列按升序排序。它会扫描所有 包含“happy”一词的行,尽管有LIMIT
。SELECT AlbumId FROM Albums WHERE SEARCH(AlbumTitle_Tokens, 'happy') ORDER BY RecordTimestamp ASC LIMIT 10
后续步骤
- 了解全文搜索查询。
- 了解如何对搜索结果进行排名。
- 了解如何对搜索结果进行分页。
- 了解如何混合使用全文查询和非文本查询。
- 了解如何搜索多个列。