排名¶
在结果出现在 UrlbarView 中之前,它们是从提供程序中获取的。
每个 UrlbarProvider 实现其自己的内部排名并返回排序后的结果。
在外部,所有结果都由 UrlbarMuxer 根据硬编码的组和子组列表进行排名。
注意
偏好设置可以影响组的顺序,例如,将 Firefox Suggest 放在搜索建议之前。
负责返回历史记录和书签结果的 Places 提供程序使用名为 Frecency 的内部排名算法。
Frecency 实现¶
Frecency 是从 frequency 和 recency 派生出来的一个术语,其作用是提供一个排名算法,该算法既考虑页面访问的频率,也考虑页面上次访问的时间。此外,它还通过奖励系统考虑每次访问的类型。
为了考虑 recency,实现了分桶系统。如果页面的访问时间晚于桶的截止时间,则它会获得与该桶关联的权重。
4 天以内 - 权重 100 -
places.frecency.firstBucketCutoff/Weight
14 天以内 - 权重 70 -
places.frecency.secondBucketCutoff/Weight
31 天以内 - 权重 50 -
places.frecency.thirdBucketCutoff/Weight
90 天以内 - 权重 30 -
places.frecency.fourthBucketCutoff/Weight
其他 - 权重 10 -
places.frecency.defaultBucketWeight
为了考虑 frequency,使用页面访问的总次数来计算最终分数。
每次访问的类型使用特定的奖励来考虑。
- 默认奖励
任何未知类型都会获得默认奖励。预计这将不会被使用。首选项
places.frecency.defaultVisitBonus
当前值:0。- 嵌入
用于非用户操作导致的嵌入/框架访问。目前,这些访问存储在内存中,并且永远不会参与 frecency 计算。因此,这目前未使用。首选项
places.frecency.embedVisitBonus
当前值:0。- 框架链接
用于由于用户操作导致的跨框架访问。首选项
places.frecency.framedLinkVisitBonus
当前值:0。- 下载
用于下载访问。支持这些访问的链接着色很重要,但它们不一定是地址栏结果的有用结果(下载视图可以更好地处理这些结果),因此它们的 frecency 可以很低。首选项
places.frecency.downloadVisitBonus
当前值:0。- 重新加载
用于重新加载访问(刷新同一页面)。较低,因为不应该可以通过多次重新加载来影响 frecency。首选项
places.frecency.reloadVisitBonus
当前值:0。- 重定向源
当页面重定向到另一个页面时使用。这是一个较低的值,因为我们更重视最终目标,即用户实际访问的目标,尤其是在永久重定向的情况下。首选项
places.frecency.redirectSourceVisitBonus
当前值:25。- 临时重定向
用于由临时重定向 (HTTP 307) 导致的访问。首选项
places.frecency.tempRedirectVisitBonus
当前值:40。- 永久重定向
用于由永久重定向 (HTTP 301) 导致的访问。这是 url 的新的假定目标,因此奖励高于临时奖励。在这种情况下,建议仅选择源访问的奖励。首选项
places.frecency.permRedirectVisitBonus
当前值:50。- 书签
用于从书签视图生成的访问。首选项
places.frecency.bookmarkVisitBonus
当前值:75。- 链接
用于普通访问,例如单击链接时。首选项
places.frecency.linkVisitBonus
当前值:100。- 键入
旨在用于用户键入的页面,实际上,当用户从 UI(历史记录视图或地址栏)中选择 url 时使用。首选项
places.frecency.typedVisitBonus
当前值:2000。
上述奖励适用于访问,此外,如果页面根本没有被访问,也会应用一些奖励,这两个奖励可以同时应用。
- 未访问的已加书签页面
用于已加书签但未访问的页面。首选项
places.frecency.unvisitedBookmarkBonus
当前值:140。- 未访问的已键入页面
用于已键入且现在已加书签的页面(否则它们将是孤立的)。首选项
places.frecency.unvisitedTypedBonus
当前值:200。
还定义了两个特殊 frecency 值。
-1
表示数据库中刚刚插入的条目,其分数尚未计算。0
表示不应该为其计算新值的条目,因为它在搜索结果中的用户价值较低(例如,place:查询)。
最后,因为每次添加新访问时都从所有访问中计算分数将非常昂贵,所以只使用最近 10 次(首选项 places.frecency.numVisits
)访问的样本。
如何计算页面的 frecency¶
如果访问了页面,则获取
NUM_VISITS
最近访问记录的样本。对于每次访问,根据访问类型获取过渡奖励。
如果页面已加书签,则向奖励中添加额外的书签奖励。
如果奖励为正,则根据访问日期获取桶权重。
将访问的点数计算为
age_bucket_weight * (bonus / 100)
。对所有采样访问记录的点数求和。
如果点数总和为零,则返回
-1
frecency,它仍将显示在 UI 中。否则,frecency 为visitCount * points / NUM_VISITS
。如果页面未被访问且未加书签,或者它是已加书签的 place 查询,则返回
0
frecency,以将其从 UI 中隐藏。如果已加书签,则添加书签奖励。
如果它也是已键入的页面,则添加已键入奖励。
Frecency 为
age_bucket_weight * (bonus / 100)
何时计算页面的 frecency¶
可能影响 frecency 分数的操作有
添加访问记录
删除访问记录
添加书签
删除书签
更改书签的 url
重新计算 Frecency
立即,当添加新的访问记录时。用户在此处的期望是,页面在访问后出现在搜索结果中。这也适用于允许添加访问记录的任何历史记录 API。
在空闲时间在后台,在任何其他情况下。在大多数情况下,拥有临时过时的值不是问题,主要问题是在删除页面历史记录时保护隐私,但删除整个历史记录将要么完全删除页面,要么如果已加书签,它仍然会相关。在这种情况下,当发生影响 frecency 的更改时,页面的
recalc_frecency
数据库字段将设置为1
。
重新计算由 PlacesFrecencyRecalculator 模块完成。当 PlacesUtils.history.shouldStartFrecencyRecalculation
值从 false 更改为 true 时,会通知重新计算器,这意味着有一些值需要重新计算。一个 DeferredTask 被激活,它将在接下来的 5 分钟内寻找用户空闲机会,否则它将在该时间过去时运行。一旦所有过时的值都已重新计算,PlacesUtils.history.shouldStartFrecencyRecalculation
将恢复为 false,直到下一个使 frecency 无效的操作。重新计算任务也在 idle-daily
通知时被激活。
当任务执行时,它会重新计算一部分页面的 frecency。如果还有更多页面需要重新计算,则会重新激活该任务。在重新计算页面的 frecency 后,其 recalc_frecency
字段将恢复为 0
。
在idle-daily
通知期间,Frecency也会每天衰减,方法是将所有分数乘以0.975
的衰减率(半衰期为28天)。这保证了未收到新访问或书签的条目会失去相关性。
自适应输入历史¶
输入历史(也称为自适应历史)是一项功能,允许查找用户之前选择的网址。为此,它将搜索字符串与选定的网址关联起来。
自适应结果通常在Frecency派生的结果之前呈现,使它们看起来具有无限的Frecency。
当用户输入给定的字符串并从地址栏中选择结果时,该关系将被存储并增加给定字符串的use_count字段。use_count字段渐近逼近最大值10
(更新方式为use_count * .9 + 1
)。
在查询时,匹配所有以输入字符串开头的搜索字符串,并为每个页面计算排名,计算公式为ROUND(MAX(use_count) * (1 + (input = :search_string)), 1)
,以便完美匹配搜索字符串的结果显示在顶部。具有相同排名的结果还会按Frecency降序排序。
在每日空闲时,当Frecency衰减时,输入历史也会衰减,特别是use_count字段会乘以0.975
的衰减率。衰减后,任何use_count < 0.975^90 (= 0.1)
的条目都会被删除,因此如果90天内未使用,条目将被删除。