对搜索结果排名

此页面介绍了如何对“ ”的搜索结果进行排名, 进行全文搜索 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)。

通常,SEARCHSCORE 函数中的 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

提升查询顺序匹配率

你可以对存在以下情况的值应用乘法提升: 包含查询字词,且顺序与其在查询中出现的顺序相同。那里 是此提升的两个版本:部分匹配和完全匹配。在以下情况下,系统会应用部分匹配加权:

  1. TOKENLIST 包含查询中的所有原始字词。
  2. 标记彼此相邻,且顺序与出现顺序相同 。

连接词、否定词和短语有一些特殊规则:

  • 包含否定运算符的查询无法获得部分匹配提升。
  • 如果查询中包含连词,其中的查询会提升 是否出现在适当的位置。
  • 如果包含某个词组的查询中的词组出现在 TOKENLIST 中,并且查询中该词组左侧的字词也出现在 TOKENLIST 中该词组左侧,对于该词组右侧的字词,也适用同样的规则,则该查询会获得权重提升。

当所有先前规则均为 true 时,Spanner 会应用完全匹配加权。查询中的第一个和最后一个令牌是文档中的第一个和最后一个令牌。

示例文档:在麻烦水上搭桥

查询 已应用的提升效果
Bridge Troubled 无提升
桥梁 - 其他水域 无提升
桥梁(跨越或在湍急水域) 无提升
过桥 部分增强
桥梁(水流湍急或水面) 部分提升
横跨困境的桥梁 精确提升
横跨“动荡”水域的桥 精确提升
桥(“Over Troubled”或 missingterm)水 精确提升

限制检索深度

搜索索引通常包含数百万份文档。对于谓词选择性较低的查询,对所有结果进行排名并不切实。评分查询通常有两个限制:

  1. 检索深度限制:要为其评分的最大行数。
  2. 结果集大小限制:查询应返回的行数上限(通常是页面大小)。

查询可以使用 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 使用最重要的排名信号对索引进行排序,这种方法特别有效。

后续步骤