为何windows自带的文件搜索这么慢,而Everything的这么快?
作为用了十年多Listary(Everything的竞品,功能差不多,似乎是更顺手点)的爱好者,深有所感,双击Ctrl弹出搜索框已经成肌肉记忆了,输个字母就出结果,确实丝滑到已经忘记Windows自带搜索的功能,我来补充点看法。
首先有必要澄清一下,你要是只看速度就得出windows的搜索”做得很烂”的结论,就有点想当然了,根本原因是它根本不敢做快,同时其设计的初衷和Everything之流压根不在一条赛道上。
同时像是Everything、Listary这类工具丝滑流畅,并非它们技术多牛,只是它们敢”作弊”。
二者不同的搜索逻辑
技术层面不少答主回答都讲的很透彻了,我尽量简短。
Windows搜索找一个文件,要调用FindFirstFile这个API,从根目录开始全盘一层层递归遍历。每进一个文件夹进行搜索,系统就要查一次访问控制列表(ACL)确认你有没有权限,如果系统安装了杀毒软件,这个请求还会被这些过滤驱动拦截和检查,然后继续再开始匹配。
也就是你电脑中有一百万个文件,就要走一百万次这个流程,多次累加,这个速度就惨不忍睹了。
Everything呢?

它主要利用 NTFS 的 MFT 来建立文件名索引。MFT你可以理解成整个硬盘的”户口本”,每个文件或目录都有对应记录,每条也就1KB。Everything启动时会扫描这些记录并建立索引,后续再结合 NTFS 的更改日志维持更新。
之后你每敲一个字母,它只在内存里做字符串匹配就像了,轻轻松松比传统递归遍历快得多。
内存检索vs递归磁盘遍历,两者的工作量差的是好几个几个数量级。
到这里,聪明的你肯定要问了,凭什么Everything能直接读MFT,Windows 检索不这么干?
二者不同的搜索定位和功能分析
其实,这才是整个问题最核心的地方,也是我觉得前面那些回答都没讲透的。
其实像Everything这种软件,读MFT有个前置条件,用户要有管理员权限。你可以留意下,Everything在安装的时候会要求你勾”以管理员身份运行”,或者后台安装服务,否则Everything什么都搜不到。

不少作为Everything的受众朋友,勾选这个选项,是因为你知道你在干什么,你需要Everything得到这个权限,来提升你的工作效率。
但Windows 文件搜索能力设计的初衷是面向几十亿用户用的,里面有你奶奶、你老板、你家小孩,甚至邻居家滚键盘的猫咪。
你说微软敢默认绕过这个未经你授权的管理员权限,来直接读底层磁盘结构吗?
当然不能,微软这么干的话,多用户隔离的设计直接就作废了。
另外,你也可以想下这个企业场景。一台Windows Server上跑着域控,A部门的共享文件夹B部门没有权限,不能看。
如果windows搜索引擎直接读MFT,那服务器上的所有的文件名就对所有人都透明了,虽然文件内容读取不了,但是文件名本身就是信息泄露,比如说”绝密XX裁员名单_最终版.xlsx”之类的文件,势必会引起渲染大波。
你要是细心点,你也会发现Everything的官方FAQ里也写得很清楚,Everything does not verify file permissions,Everything不校验文件权限,也就是你搜到的文件你不一定有权打开,但你能看到它叫什么、在哪。
当然,这对个人用户无所谓,对企业来说是安全事故。
另外再补充个冷知识,Everything默认只支持NTFS,存在一定的局限性。你插的U盘假如是FAT32格式,它会搜不到;你挂个exFAT格式的SD卡,他搜不到。你装个NAS网络驱动器,他还是搜不到。还有OneDrive云端文件,他也没能力。
当然,也有解决方式,需要你进阶一下,手动把这些添加文件夹索引才行。
而Windows 搜索生来就是全面兼容。不管NTFS、FAT32、exFAT、ReFS、网络共享还是OneDrive,它都得能搜索。二者的比较,更像是你让一个同时会开轿车、卡车、拖拉机、船和直升机的全才,去和一个专业只会赛车的朋友PK,说他轿车开得太稳了,比不过开赛车的,二者完全不是一个逻辑设计出来的产物。
再补充一点,Everything搜的是文件名,快到飞起,但你以为Windows只搜文件名?
没那么简单,它还会把你Word文档打开来读里面的文字,PDF也读,PPT、所以相关文件的文字也建索引。后台维护一个叫Windows.edb的数据库,用微软自家ESE引擎,把文件内容的关键词全索引进去,也就是你搜的是所有的文件里的内容。
对比而言,Everything是一本”花名册”,只记名字(ps. Everything 1.5后版本开始支持内容搜索,和windows搜索不同,它是解析电脑部分支持的文件类型并提取文本进入索引)。
Windows Search想做”全文检索引擎”,连你文档里写了什么都管。譬如你搜”电力”俩字,Everything只能找文件名带”电力”的文件,Windows 搜索理论上能把某份文件正文里的“电力”相关内容也翻出来。

Windows 搜索功能确实很强,在功能层面被喷,确实有点冤的。
不过从用户体验来说,Windows 搜索确实不大行,一板一眼的龟速,急起来让人拍桌子。
最后说几句
说到这儿顺便聊聊我自己的选择。
Everything用起来确实快,文件名搜索它可能是软件天花板了。
但我日常还是用Listary,原因不是速度,是它的工作流,Listary核心不是”帮你找文件”,是”帮你少动鼠标”。
双击Ctrl呼出来,打几个字母找到文件直接回车打开,更爽的是它能嵌入Windows的打开/保存这些功能到对话框里。

比如说你想VS code里点”打开文件”,Listary直接在底部出现搜索条,一步到位,不用打开VS code然后慢慢翻文件夹打开了,这个体验用过你就回不去了。
同时它的底层也是读MFT建索引,速度跟Everything一个量级,另外额外做了模糊匹配和使用频率学习,常开的文件排前面,打两三个字母就命中。

它的功能还有很多,有兴趣可以看下Listary使用说明。
需要注意的是它也有同样的限制,只支持本地NTFS盘,网络驱动器和非NTFS卷就慢得多。
所以要评判这些本地搜索软件,快不快这件事,本质上是你愿意拿什么去换。
Everything和Listary拿掉了权限校验、拿掉了多文件系统支持、拿掉了内容索引,换来了极致的文件名搜索速度。
Windows Search什么都不敢丢,什么功能也没给你省,所以怎么都快不了。
软件的速度从来不是纯技术问题,是取舍问题。
微软不是做不出快的搜索,是它服务的那十五亿人里,有太多场景不允许它走捷径。
参考来源: