哪种算法用于在Visual Studio Code / Google Chrome Developer / Sublim



我对Sublime强大的搜索功能印象深刻,我们后来在Visual Studio Code和Google Chrome Developer中找到了该功能。

一个非常基本的搜索算法可能会使用 Trie,我猜,但这种对 Sublime 等文件的搜索似乎是某种多方向 Trie(如果有这样的事情!),即如果你有一个文件名,比如:

"我是一个非常大的漂亮文件和其他东西.js">

然后,您从该文件的名称中搜索"创建的文件","创建的文件","漂亮的东西","其他大","其他大"或任何其他字符串组合,Sublime和Visual Studio代码将立即找到它和其他具有相似名称的文件。(谷歌浏览器开发者版本虽然不是很强大,但这不是这里的重点)。

因此,我深入研究了Visual Studio的源代码,但仍然无法弄清楚搜索是如何实现的以及使用哪种算法。我不是在找它的代码。只需要了解这个为我们开发人员节省大量时间的强大功能是如何实现的高级理论。

可以通过查看调用此函数时发生的情况来跟踪要查找的 VS Code 功能:

https://github.com/microsoft/vscode/blob/master/src/vs/workbench/contrib/search/browser/anythingQuickAccess.ts#L365

这里有一个有趣的部分(仅过滤第一个项,然后过滤整个过滤器):

https://github.com/microsoft/vscode/blob/d1220da07267242e9b58193da0ded43bbe7f2aa5/src/vs/workbench/contrib/search/browser/anythingQuickAccess.ts#L570

如果你从那里挖掘,你会发现大多数有用的东西都重新组合在这个文件中:

https://github.com/microsoft/vscode/blob/master/src/vs/base/common/fuzzyScorer.ts

一些注意事项:

模糊搜索非常严格,如果未找到单个字母或未按正确的顺序找到字母,则过滤器将不匹配。一个关键的优点是,您可以在结果中突出显示匹配的部分,并且它非常清楚地表明了用户正在发生的事情。

模糊记分器根据匹配的标签/描述[/路径]对结果进行评分(对于文件,标签 = 文件名,描述 = 没有名称的路径)。

这看起来像 DevTools 用于在命令菜单中进行模糊搜索的代码。

https://cs.chromium.org/chromium/src/third_party/WebKit/Source/devtools/front_end/quick_open/CommandMenu.js?l=174

底层的差异算法是:

https://cs.chromium.org/chromium/src/third_party/WebKit/Source/devtools/front_end/diff/Diff.js?q=Diff.Diff&dr=CSs&l=4

我认为这个名字是"模糊搜索"哈哈。 这里有一个不错的 github 存储库,一些好心的人发布了一个开源 JS 版本,它比 VS Code 版本更容易包含在您的代码中,因为它在 npm 上并且它只是一个文件:

https://github.com/farzher/fuzzysort

最新更新