【免费下载链接】fsearchWhole-disk file search for macOS: fuzzy names, typo tolerance, indexed content grep. ~1 ms over 8M files.项目地址https://gitcode.com/gh_mirrors/fsea/fsearch点击查看免费下载fsearch 是 macOS 上的全盘文件搜索引擎模糊匹配文件名、容忍一个拼写错误、基于倒排索引搜索文件内容在 800 万文件上约 1 ms 返回结果。它是完整的 Rust 文件搜索工具既可嵌入为Rust Cratefsearch::Engine也可通过JSON Lines Unix Socket或fsearch stdio从任意语言调用。本文是该项目的开发者完整参考覆盖 API 快速上手、协议字段、查询语法与常见坑点 30 秒理解架构一个引擎两种集成fsearch 的核心是一个后台引擎启动时全量爬盘约 20 秒之后靠 FSEvents 增量维护名字索引存于单个 mmap 文件、内容搜索用 trigram三元组倒排索引。两种集成方式共用同一份索引集成方式适用场景入口Rust Crate写 Rust 应用直接进程内搜索src/engine.rs 的EngineJSON Lines Socket任意语言Python/JS/Shell跨进程调用src/server.rs 的守护进程fsearch stdio命令行管道、脚本内快速查询src/main.rs#L126-L145对外导出集中在 src/lib.rs#L14-L16Engine、Options、Query、Grep、GrepResult等模块划分清晰engine/query/content/index/live/walk。 第一部分Rust Crate API 快速上手1. 三个核心类型与启动引擎整个 API 围绕三个类型展开定义在 src/engine.rs类型作用源码位置Options索引目录dir、用户主目录home、黑名单skipengine.rs#L33-L41Engine搜索引擎本体Clone后可跨线程共享engine.rs#L73-L75Query解析自人类查询语言驱动名字搜索query.rs#L52-L66最小集成依赖本仓库 crate 即可Engine::start后台建索引并立即返回let home std::env::var(HOME)?; let engine fsearch::Engine::start(fsearch::Options { dir: fsearch::default_dir(home), // ~/Library/Application Support/FSearch home: home.clone(), skip: None, })?; let q fsearch::Query::parse(fsearch main, home)?; for f in engine.search(q)? { println!({}, f.path.display()); }⚠️ 索引未就绪首次全量爬盘约 20 秒时search/grep会返回Err(indexing (first run scans the whole disk, ~20s))轮询status()的ready字段即可。2. 日常四方法search / grep / status / save方法签名要点说明Engine::searchQuery → VecFound名字模糊搜索返回带评分的结果Engine::grep(Query, Grep) → (GrepResult, bool)内容搜索bool表示由内容索引回答还是回退扫描Engine::status→ Status索引规模、内存占用、内容索引进度、是否 ownerEngine::save无参请求后台压缩并落盘名字索引结果结构Found { path, kind, size, mtime, score }engine.rs#L44-L51kind低 2 位区分 file/dir/linkStatusengine.rs#L53-L70含entries、content_docs、full_disk_access、owner等字段。内容搜索用Grep::new(pattern, mode)构造三种模式Literal默认smart-case 自动忽略大小写、Regex、Symbol只找定义处如fn apply_dir见 content.rs#L915-L932。可调max_per_file默认每文件 5 条与budget默认 250 ms 时间预算let g fsearch::Grep::new(apply_dir, fsearch::GrepMode::Symbol)?; let (res, indexed) engine.grep(q, g)?; // res.files: VecFileMatches { path, lines: Vec(行号, 文本) } // res.complete false 表示时间预算用完结果按排名截断3. 查询语言速查模糊词 12 个过滤器Query::parsequery.rs#L98-L111支持 fzf 风格模糊匹配5 个字母以上的词容忍一个拼写错误mian.rs能找到main.rs写法含义main rs模糊词文件名或路径中按序匹配exact/^prefix/suffix$精确 / 前缀 / 后缀!exclude排除ext:rs,rs、type:image、kind:dir扩展名、类型image/video/code/doc 等、种类in:~/Developer、size:5mb、mtime:7d目录范围、大小、修改时间re:/path:文件名 / 全路径正则grep:/regex:/sym:文件内容搜索字面 / 正则 / 符号定义limit:20返回条数默认 50评分细节fzf 风格子序列打分 词边界/驼峰加分 错别字惩罚在 query.rs#L407-L471。4. 多进程共享一份索引Owner / Follower 机制这是最容易忽略的设计索引目录里有一把flock文件锁同一时间只有一个进程写索引owner其余进程跟随follower。你的 App 和 CLI 可以同时运行、共享一份索引owner 退出后 follower 自动接管try_upgradeengine.rs#L345-L357。因此嵌入时不需要额外做单实例逻辑。其他实用函数fsearch::default_dir(home)— 默认数据目录engine.rs#L655-L657fsearch::has_full_disk_access()— 检查 Full Disk Accessengine.rs#L381-L383fsearch::gated(home)— 无 FDA 时自动跳过的隐私受保护目录列表engine.rs#L375-L377fsearch::no_materialize()— 防止索引时触发 iCloud 占位文件下载 第二部分JSON Lines Socket 协议参考1. 连接方式socket 路径与自动拉起守护进程监听~/Library/Application Support/FSearch/fsearch.sockserver.rs#L12-L14协议为每行一个 JSON 对象、请求一行对应响应一行fsearch stdio # 把 stdin/stdout 透传到守护进程最适合脚本任何语言也可直接连 Unix socket——若守护进程没在跑fsearch客户端会自动spawn它再重试server.rs#L188-L211。Python 示例import os, socket, json s socket.socket(socket.AF_UNIX) s.connect(os.path.expanduser(~/Library/Application Support/FSearch/fsearch.sock)) s.sendall(b{q: fsearch main, limit: 5}\n) print(json.loads(s.recv(65536)))2. 五种 op 请求速查表op请求示例说明ping{op: ping}连通性测试status{op: status}索引状态未就绪时返回 errorsearch默认{q: fsearch main, limit: 20}名字搜索省略op即 searchgrep{op: grep, pattern: apply_dir, in: ~/Developer}内容搜索save{op: save}请求后台压缩落盘补充细节见 server.rs#L70-L112id字段请求里带的任意id会原样回显到响应方便并发多路复用自动识别内容搜索q中出现grep:/regex:/sym:/content:/symbol:时自动按 grep 处理server.rs#L72-L74过滤器可拆成独立字段{q: main, ext: rs, in: ~/Developer}等价于写在q里server.rs#L160-L176grep 专属参数modeliteral/regex/symbol、per_file、budget_msserver.rs#L117-L133。3. 响应字段逐条解读search 响应server.rs#L91-L109{ok: true, took_us: 1234, id: r1, hits: [{path: /Users/me/main.rs, kind: file, size: 4821, mtime: 1760000000, score: 142}]}grep 响应server.rs#L146-L155字段含义sourceindextrigram 索引命中或scan名字索引选文件后直读candidates/read候选文件数 / 实际打开读取数completefalse表示 250 ms 预算用完结果按排名截断先返回最相关的indexing内容索引尚在后台处理的文件数files[].matches[{line, text}]逐条匹配行status 响应即Status序列化engine.rs#L54-L70entries索引条目数、content_docs、index_bytes、owner本进程是否写索引等。⚡ 性能基线与常见坑点在 M4 Max、770 万文件的实测README.md指标数值全盘按名字找文件p50 ≈ 1.3 ms文件内容搜索p50 ≈ 9 ms新文件/改名/删除反映到结果~0.1 s首次全量爬盘~20 s仅一次守护进程内存30–135 MB五个最常见的坑启动后立即搜索报错— 首次运行在爬盘indexing错误属正常轮询status即可grep 结果不全—complete: false是时间预算截断需要全量时传更大的budget_ms搜不到某些目录— 无 Full Disk Access 时会自动跳过 Desktop、Documents 等受保护目录不弹窗给~/.local/bin/fsearch授予 FDA 后用fsearch install --login注册开机自启只起一个守护进程—socket.lock保证每目录单守护进程server.rs#L20-L24但多个嵌入Engine的进程可安全共存mtime是秒—Found.mtime与响应字段均为u32Unix 秒不是毫秒。 源码位置速查表关注点文件对外 API 汇总src/lib.rs引擎、Owner/Follower、索引压缩src/engine.rs查询解析与模糊打分src/query.rstrigram 内容索引、Grep 实现src/content.rs索引二进制格式、mmap 布局src/index.rsFSEvents 增量跟踪src/fsevents.rs、src/live.rs全盘扫描getattrlistbulksrc/walk.rs守护进程与 JSON Lines 协议src/server.rsCLI / stdio / install / benchsrc/main.rs构建配置opt-level 3 fat LTOCargo.toml与 fff 的基准测试脚本demo/vs_fff.py总结Rust 项目直接Engine::start三行接入享受毫秒级模糊搜索 内容 grep其他语言走 JSON Lines socket五种 op 覆盖全部能力。两种路径共享同一份实时索引这正是 fsearch 作为文件搜索基础设施的集成精髓。赞分享【免费下载链接】fsearchWhole-disk file search for macOS: fuzzy names, typo tolerance, indexed content grep. ~1 ms over 8M files.项目地址https://gitcode.com/gh_mirrors/fsea/fsearch点击查看免费下载相关推荐BilldDesk Pro API完全指南从入门到精通的远程桌面开发集成手册BilldDesk Pro API完全指南从入门到精通的远程桌面开发集成手册 BilldDesk是基于Vue3 WebRTC Nodejs Flu桌面应用前端音视频网络Riot搜索引擎API参考手册完整接口调用指南Riot搜索引擎API参考手册完整接口调用指南 Riot是一款基于Go语言的开源分布式全文搜索引擎以其简单高效的特性受到开发者青睐。本指南将为您详细介绍Ri全文检索后端Remote benefitsRemote benefits Flexible working hours Home office stipend Annual retreat Applic数据集创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考