
Windows 多个功能用 rank 排序,但文档未说明 rank 含义
来源标题:There are things with ranks, but it's not always clear what the ranks mean
Windows 多项功能用 rank 建立排序,但官方文档未统一说明 rank 的高低代表什么。以 SQL Server 全文搜索为例,其文档明确 higher rank 表示匹配质量更好,rank 值范围 0 到 1000,仅表示相对相关性顺序,实际数值每次查询可能不同。
以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
Windows 中有不少功能会依据一个叫“rank”的东西来确定顺序。遗憾的是,它们的文档并不总会告诉你 rank 到底意味着什么。更高的 rank 是否优先于更低的 rank?
我先从 SQL Server 查起。在《Limit search results with RANK》这一文档页面上,开头就告诉你 rank 越高表示匹配越好,或者至少说 rank 越低匹配越差,这基本上是同一回事:
CONTAINSTABLE 和 FREETEXTTABLE 函数返回一个名为 RANK 的列,其中包含从 0 到 1,000 的序数值(rank 值)。这些值根据各行与选择条件的匹配程度对行进行排名。rank 值只表示结果集中各行相关性的相对顺序,值越低表示相关性越低。实际值并不重要,而且通常每次运行查询时都会不同。
它说 rank 越低匹配质量越差,这就意味着匹配质量越高 rank 越高。
在《Query with Full-Text Search》页面上,这种“越高越好”表达得更明确:查询结果的 RANK 是一个随着匹配质量提高而增大的值:
一行中文本或文档的 rank 值越高,该行对于给定的全文查询就越相关。
好了,这就是 SQL Server。干得不错,SQL Server。
Windows Package Graph 也有 rank 的概念。而这里的文档就没那么有帮助了。
AddPackageDependency 函数的 rank 参数文档是这样写的:
用于将解析后的包添加到调用方包图时要使用的 rank。更多信息请参阅备注。
如果你往下翻到备注部分,唯一提到 rank 的地方是:
如果包图中存在多个与
AddPackageDependency调用具有相同 rank 的包,则解析后的包(默认)会被添加到同 rank 的其他包之后。若要将包添加到同 rank 的其他包之前,请为 options 参数指定AddPackageDependencyOptions_PrependIfRankCollision。
这固然不错,但它并没有告诉我搜索包时是从低 rank 到高 rank,还是从高 rank 到低 rank。我只知道,如果我想排在同 rank 的其他包前面,就应该传这个特殊标志;否则默认排在同 rank 的其他包后面。但它没有说明我相对于不同 rank 的其他包是排在前面还是后面。
有一个“更多信息”链接把我带到《Using the Dynamic Dependency API》页面,但那里唯一提到 rank 的地方是:
调用此 API 时,必须传入创建安装时引用时返回的依赖项 ID,以及该 MSIX 包在进程包图中要使用的所需 rank。
所以它告诉我必须传一个 rank,但没告诉我这个 rank 是什么意思。
好吧,也许我可以从 Windows App SDK 的另一个 API 中找到线索:WidgetInfo 类上的 Rank 属性。看看它怎么说。
一个整数,指定该小组件的相对 rank。较小的值排名高于较低的值。
好吧,我了解到 rank 是相对值而非绝对值。但第二句话完全说不通:它说较小的值与较低的值会受到不同对待。嗯? “较小的值”和“较低的值”有什么区别?再说“更高的”rank 到底是什么意思?
不幸的是,Widget 示例并没有使用 Rank 属性,所以我还是不知道。
这不过是“最了解某个功能的人,往往是最不适合解释它的人”这一原则的又一个例证。他们知道 rank 是什么。他们和 rank 打了几个月交道。对他们来说,rank 如此显而易见、如此直观,根本不需要解释。
补充闲聊:我联系了一位从事包图工作的同事,他向我解释了它的工作原理,同时也感叹提供给文档团队的信息不知怎么就在传递过程中变得混乱了。(并把修复这件事放进了待办列表。)
换句话说,至少对于包图而言,较低的 rank 优先于较高的 rank。
一个进程的包图是一个有序的包列表,初始为空。
如果进程声明了依赖项,那么所有这些包都会以 rank 零添加到包图中,顺序由静态包依赖项解析算法描述。
初始包图建立之后,你可以通过调用 AddPackageDependency 和 RemovePackageDependency 手动修改该图。当你向包图添加一个包时,它会被插入到所有 rank 更低的包之后、所有 rank 更高的包之前。默认情况下,它也会排在同 rank 的所有包之后,但你可以用 AddPackageDependencyOptions_PrependIfRankCollision 覆盖这一点,把它放到同 rank 的所有包之前。
在包图中,rank 是一个有符号整数,因此你可以使用负 rank 来排到静态包依赖项前面。
补充补充闲聊:在筛选器驱动程序的世界里,适用的术语是 altitude,其含义被解释得相当清楚:
altitude 是一个无限精度字符串,被解释为十进制数。数值 altitude 较低的筛选器驱动程序会被加载到 I/O 栈中数值 altitude 较高的筛选器驱动程序之下。
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。