排名

在结果出现在 UrlbarView 中之前,它们是从提供程序中获取的。

每个 UrlbarProvider 实现其自己的内部排名并返回排序后的结果。

在外部,所有结果都由 UrlbarMuxer 根据硬编码的组和子组列表进行排名。

注意

偏好设置可以影响组的顺序,例如,将 Firefox Suggest 放在搜索建议之前。

负责返回历史记录和书签结果的 Places 提供程序使用名为 Frecency 的内部排名算法。

Frecency 实现

Frecency 是从 frequencyrecency 派生出来的一个术语,其作用是提供一个排名算法,该算法既考虑页面访问的频率,也考虑页面上次访问的时间。此外,它还通过奖励系统考虑每次访问的类型。

为了考虑 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

流程图 TD start[URL] a0{有访问记录吗?} a1[获取最近 10 次访问记录] a2[奖励 = 未访问奖励 + 已加书签 + 已键入] a3{奖励 > 0?} end0[Frecency = 0] end1["frecency = 年龄桶权重 * (奖励 / 100)"] a4[对所有采样访问记录的点数求和] a5{点数 > 0?} end2[frecency = -1] end3["Frecency = 访问次数 * (点数 / 样本大小)"] subgraph sub [每次访问] sub0[奖励 = 访问类型奖励] sub1{已加书签?} sub2[添加书签奖励] sub3["分数 = 年龄桶权重 * (奖励 / 100)"] sub0 --> sub1 sub1 -- yes --> sub2 sub1 -- no --> sub3 sub2 --> sub3; end start --> a0 a0 -- no --> a2 a2 --> a3 a3 -- no --> end0 a3 -- yes --> end1 a0 -- yes --> a1 a1 --> sub sub --> a4 a4 --> a5 a5 -- no --> end2 a5 -- yes --> end3

Frecency 计算流程

  1. 如果访问了页面,则获取 NUM_VISITS 最近访问记录的样本。

  2. 对于每次访问,根据访问类型获取过渡奖励。

  3. 如果页面已加书签,则向奖励中添加额外的书签奖励。

  4. 如果奖励为正,则根据访问日期获取桶权重。

  5. 将访问的点数计算为 age_bucket_weight * (bonus / 100)

  6. 对所有采样访问记录的点数求和。

  7. 如果点数总和为零,则返回 -1 frecency,它仍将显示在 UI 中。否则,frecency 为 visitCount * points / NUM_VISITS

  8. 如果页面未被访问且未加书签,或者它是已加书签的 place 查询,则返回 0 frecency,以将其从 UI 中隐藏。

  9. 如果已加书签,则添加书签奖励。

  10. 如果它也是已键入的页面,则添加已键入奖励。

  11. 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天内未使用,条目将被删除。