此页面介绍了如何对“ ”的搜索结果进行排名, 进行全文搜索 Spanner。
Spanner 支持计算话题性分数,该分数提供 组件,用于创建复杂的排名功能。这些比分 根据查询字词计算结果与查询的相关性 频率和其他可自定义的选项。
以下示例展示了一个按顺序排名的搜索:
SELECT AlbumId
FROM Albums
WHERE SEARCH(AlbumTitle_Tokens, @p)
ORDER BY SCORE(AlbumTitle_Tokens, @p) DESC
使用 SCORE
函数为查询字词评分
SCORE
函数计算每个查询字词的得分,然后将
得分。每个字词的分数大致基于术语频率 - 逆向文档频率 (TF/IDF) 计算得出。该得分是记录最终排序的组成部分之一。该查询会将其与其他信号(例如用于调节主题性得分的最新性)相结合。
在当前实现中,只有在使用 enhance_query=>true
时,TF/IDF 的 IDF 部分才可用。它根据 Google 搜索使用的完整网页语料库(而非特定搜索索引)计算字词的相对频率。如果未启用 rquery 增强功能,则评分仅使用字词频率 (TF) 组件(即 IDF 字词设为 1)。
通常,SEARCH
和 SCORE
函数中的 enhance_query
选项相同。
SCORE
函数会返回用作相关性得分的值,
Spanner 用来建立排序顺序。它们没有独立含义。得分越高,与查询的匹配度就越高。
对多个列进行评分
Spanner 使用 SCORE
函数为每个字段评分
。然后,查询会将这些单独的得分组合在一起。常见的方法是将各个得分相加,然后根据用户提供的字段权重(使用 SQL 查询参数提供)对其进行提升。
例如,以下查询会组合两个 SCORE
函数的输出:
SELECT AlbumId
FROM Albums
WHERE SEARCH(Title_Tokens, @p1) AND SEARCH(Studio_Tokens, @p2)
ORDER BY SCORE(Title_Tokens, @p1) * @titleweight + SCORE(Studio_Tokens, @p2) * @studioweight
LIMIT 25
以下示例添加了两个提升参数:
- 新鲜度 (
FreshnessBoost
) 可提高得分,(1 + @freshnessweight * GREATEST(0, 30 - DaysOld) / 30)
- Popularity(
PopularityBoost
) 会将得分乘以系数(1 + IF(HasGrammy, @grammyweight, 0)
来提高得分。
为确保可读性,该查询使用 WITH
运算符。
SELECT AlbumId
FROM Albums
WHERE SEARCH(Title_Tokens, @p1) AND SEARCH(Studio_Tokens, @p2)
ORDER BY WITH(
TitleScore AS SCORE(Title_Tokens, @p1) * @titleweight,
StudioScore AS SCORE(Studio_Tokens, @p2) * @studioweight,
DaysOld AS (UNIX_MICROS(CURRENT_TIMESTAMP()) - ReleaseTimestamp) / 8.64e+10,
FreshnessBoost AS (1 + @freshnessweight * GREATEST(0, 30 - DaysOld) / 30),
PopularityBoost AS (1 + IF(HasGrammy, @grammyweight, 0)),
(TitleScore + StudioScore) * FreshnessBoost * PopularityBoost)
LIMIT 25
提升查询顺序匹配率
你可以对存在以下情况的值应用乘法提升: 包含查询字词,且顺序与其在查询中出现的顺序相同。那里 是此提升的两个版本:部分匹配和完全匹配。在以下情况下,系统会应用部分匹配加权:
TOKENLIST
包含查询中的所有原始字词。- 标记彼此相邻,且顺序与出现顺序相同 。
连接词、否定词和短语有一些特殊规则:
- 包含否定运算符的查询无法获得部分匹配提升。
- 如果查询中包含连词,其中的查询会提升 是否出现在适当的位置。
- 如果包含某个词组的查询中的词组出现在
TOKENLIST
中,并且查询中该词组左侧的字词也出现在TOKENLIST
中该词组左侧,对于该词组右侧的字词,也适用同样的规则,则该查询会获得权重提升。
当所有先前规则均为 true 时,Spanner 会应用完全匹配加权。查询中的第一个和最后一个令牌是文档中的第一个和最后一个令牌。
示例文档:在麻烦水上搭桥
查询 | 已应用的提升效果 |
---|---|
Bridge Troubled | 无提升 |
桥梁 - 其他水域 | 无提升 |
桥梁(跨越或在湍急水域) | 无提升 |
过桥 | 部分增强 |
桥梁(水流湍急或水面) | 部分提升 |
横跨困境的桥梁 | 精确提升 |
横跨“动荡”水域的桥 | 精确提升 |
桥(“Over Troubled”或 missingterm)水 | 精确提升 |
限制检索深度
搜索索引通常包含数百万份文档。对于谓词选择性较低的查询,对所有结果进行排名并不切实。评分查询通常有两个限制:
- 检索深度限制:要为其评分的最大行数。
- 结果集大小限制:查询应返回的行数上限(通常是页面大小)。
查询可以使用 SQL 子查询来限制检索深度:
SELECT *
FROM (
SELECT AlbumId
FROM Albums
WHERE SEARCH(Title_Tokens, @p1)
ORDER BY ReleaseTimestamp DESC
LIMIT @retrieval_limit
)
ORDER BY SCORE(Title_Tokens, @p1)
LIMIT @page_size
如果 Spanner 使用最重要的排名信号对索引进行排序,这种方法特别有效。
后续步骤
- 了解全文搜索查询。
- 了解如何执行子字符串搜索。
- 了解如何对搜索结果进行分页。
- 了解如何混合全文和非文本查询。
- 了解如何搜索多个列。