本地优先的语义文件管理器 — 在文件名搜索之上叠加内容语义搜索,所有 AI 推理在本机完成。
搜「向量」能找到讲解向量嵌入与混合搜索的笔记,即使文件名里没有这两个字。文件内容不出本机。
- 关键词搜索 — 基于倒排索引,毫秒级响应,命中片段高亮
- 语义搜索 — 基于
bge-small-zh-v1.5嵌入模型的向量相似度搜索,理解同义词和上下文 - 混合匹配 — 关键词 + 语义双路召回,可在结果面板按「全部 / 关键词 / 语义」筛选
- 匹配片段 — 搜索结果展示命中上下文片段,关键词高亮
- 相似文件 — 选中文件后自动推荐语义相近的其他文件(需启用语义索引)
- 三栏布局 — 左侧目录树 / 中间文件列表 / 右侧详情或搜索结果
- 文件类型识别 — 12 类文件独立色相图标(图片/视频/音频/代码/文档/表格/PPT/PDF/压缩包/配置/Markdown/文件夹),一眼可辨
- 侧栏折叠 — 左侧栏可折叠为图标模式,节省横向空间
- 目录树导航 — 树形展开/折叠,支持快捷访问(桌面/文档/下载等)
- 多列网格 — 自适应 1/2/3 列文件网格,按名称/大小/日期排序
- 面包屑导航 — 顶部路径面包屑,点击任意层级快速跳转
- 命令面板 —
Ctrl/Cmd + K唤起全局快速搜索,键盘 ↑↓ 导航、Enter 打开、Esc 关闭 - 双主题 — 亮色(默认)/ 深色一键切换,自动持久化
- 玻璃态 UI — 顶栏、状态栏、命令面板、Toast 采用 backdrop-blur 玻璃质感
- 骨架屏加载 — 搜索期间显示骨架屏,避免白屏闪烁
- 启动屏 — 模型加载期间显示启动动画
- 键盘友好 — 完整的 focus-visible 焦点环,命令面板支持完整键盘导航
- 可访问性 —
aria-*标签、role语义、prefers-reduced-motion适配
- 增量索引 — 文件未变更时秒级重建,基于内容哈希跳过未变文件
- 多格式提取 — 支持 txt / md / docx / xlsx / pdf / pptx / csv 等格式
- 缓存管理 — 底部状态栏显示缓存文件数与体积,一键清除
- 递归索引 — 可选是否递归子目录
- INT8 量化 — 模型 INT8 量化降低内存占用
- 完全离线 — 不依赖任何云服务,模型本地加载,文件内容不外传
↑ 三栏主界面:左侧目录树 · 中间文件列表 · 右侧文件详情
↑ 语义搜索:搜「向量」命中「向量嵌入与混合搜索.md」,右侧展示匹配上下文片段
应用启动后呈现三栏布局:
┌─────────────────────────────────────────────────────────────┐
│ [Logo] FileWise [搜索框] [索引状态] [☀/🌙] │ ← 玻璃态顶栏
├─────────┬───────────────────────────────┬───────────────────┤
│资源管理器│ ↑ 路径 / 文件夹 / 子目录 │ ← 返回搜索结果 │
│ │ [名称][大小][日期] │ [图标] 文件名 │
│打开文件夹│ ┌─────┐ ┌─────┐ ┌─────┐ │ 路径 │
│ │ │ 📁 │ │ 📄 │ │ 🎬 │ │ ━━━━━━━ 78% │
│快捷访问 │ │folder│ │doc │ │video│ │ 12 KB · 昨天 │
│ 桌面 │ └─────┘ └─────┘ └─────┘ │ │
│ 文档 │ ┌─────┐ ┌─────┐ ┌─────┐ │ [匹配片段] │
│ 下载 │ │ 🖼 │ │ 💻 │ │ 📦 │ │ ...向量嵌入... │
│ │ │img │ │code │ │zip │ │ │
│目录树 │ └─────┘ └─────┘ └─────┘ │ [相似文件] │
│ ▶ 项目 │ │ 检索原理.md 82% │
│ ▶ 备份 │ │ embedding.md 71%│
├─────────┴───────────────────────────────┴───────────────────┤
│ 36 个项目 ● 1280 文件 ✨刷新语义 🗑 │ ← 状态栏
└─────────────────────────────────────────────────────────────┘
- Node.js ≥ 18
- Rust ≥ 1.70(含 cargo)
- Python ≥ 3.9(首次下载/量化模型用)
- 系统依赖(按 Tauri v2 要求):
- Windows:Microsoft Visual Studio C++ Build Tools + WebView2
- macOS:Xcode Command Line Tools (
xcode-select --install) - Linux:
webkit2gtk-4.1、libayatana-appindicator3-dev等(详见 Tauri prereqs)
# 1. 克隆仓库
git clone <repo-url>
cd file-wise-v2
# 2. 安装前端依赖
npm install
# 3. 下载并量化模型(首次运行必做,模型会放到 src-tauri/models/)
python scripts/download_model.py
python scripts/quantize_model.py
# 4. 启动开发模式
npm run tauri dev首次启动会编译 Rust 后端(耗时数分钟),并加载
src-tauri/models/bge-small-zh-int8.onnx嵌入模型。模型加载完成后右下角会弹出 Toast 提示。
npm run tauri build产物位于 src-tauri/target/release/bundle/:
- Windows:
.msi/.exe - macOS:
.dmg/.app - Linux:
.deb/.AppImage
- 点击左上角「打开文件夹」按钮选择目录
- 或点击「快捷访问」中的桌面/文档/下载等系统目录
- 或在目录树中点击任意层级
进入目录后,顶部会出现「建立索引」提示条:
- 点击「建立索引」开始关键词索引(可选「递归」子目录)
- 索引完成后,底部状态栏出现绿色圆点和文件数
- 点击状态栏的「✨+语义」按钮建立语义索引(首次较慢,需调用嵌入模型)
两种方式:
- 顶部搜索框 — 输入关键词,自动 debounce 300ms 后触发搜索,结果显示在右栏
- 命令面板 — 按
Ctrl/Cmd + K唤起,浮层式快速搜索
搜索结果面板功能:
- 顶部「全部 / 关键词 / 语义」筛选按钮切换匹配类型
- 每条结果显示:文件名 + 类型图标 + 相似度百分比 + 渐变进度条 + 命中片段
- 单击:在右栏查看详情(匹配片段、相似文件、关键词标签)
- 双击:直接打开文件(系统默认程序)
- 鼠标悬停后出现「定位到文件夹」按钮
选中文件后右栏显示:
- 文件类型大图标(按类型上色)
- 文件名 + 完整路径
- 匹配度(仅搜索模式,渐变进度条 + 百分比)
- 文件大小 + 修改时间
- 匹配片段(搜索模式)— 命中上下文,关键词高亮
- 相似文件(搜索模式 + 语义索引启用)— 自动推荐语义相近的文件
- 关键词标签 — 从文件名提取的关键词,命中查询词时高亮
点击顶栏右侧的 ☀️/🌙 按钮切换亮/深色主题,选择会保存到 localStorage,下次启动自动恢复。
点击侧栏左上角的「面板」图标按钮,侧栏折叠为 56px 图标模式;再次点击恢复。
底部状态栏显示当前缓存文件数与体积,点击 🗑 图标清除所有缓存(包括所有目录的索引和向量)。
| 快捷键 | 功能 |
|---|---|
Ctrl/Cmd + K |
唤起/关闭命令面板 |
↑ / ↓ |
命令面板中移动选择 |
Enter |
命令面板中打开选中文件 |
Esc |
关闭命令面板 |
| 双击文件 | 用系统默认程序打开 |
| 层 | 技术 |
|---|---|
| 桌面框架 | Tauri v2 |
| 前端 | Vue 3.5 + TypeScript + Pinia 3 + Tailwind CSS v4 |
| 后端 | Rust (Edition 2021) |
| 推理引擎 | ONNX Runtime (CPU, INT8 量化) |
| 嵌入模型 | BAAI/bge-small-zh-v1.5 |
| 分词器 | HuggingFace tokenizers |
| 向量搜索 | 暴力 L2 距离(INT8 量化) |
| 文档提取 | quick-xml (docx) / calamine (xlsx/csv) / pdf-extract (pdf) / pptx-to-md (pptx) |
| 并行处理 | rayon + parking_lot |
file-wise-v2/
├── index.html # Vite 入口,加载 Inter + JetBrains Mono 字体
├── package.json # 前端依赖与脚本
├── tailwind.config.js # Tailwind v4 配置(fontSize/animation/plugins)
├── vite.config.ts # Vite 配置(端口 1420)
├── src/ # 前端源码
│ ├── main.ts # 应用入口(createApp + Pinia)
│ ├── App.vue # 根组件(三栏布局 + 启动屏 + 主题根节点)
│ ├── style.css # 设计令牌(双主题 + 玻璃态 + 渐变 + 动画)
│ ├── types/index.ts # TypeScript 类型定义
│ ├── utils/
│ │ ├── format.ts # 文件大小/日期格式化
│ │ ├── fileIcon.ts # 文件类型 → 图标 + 颜色 + 底色映射
│ │ └── icons.ts # Lucide SVG 图标库(本地化)
│ ├── stores/
│ │ ├── fileStore.ts # 文件/搜索/索引/缓存/相似文件状态
│ │ └── uiStore.ts # 主题/侧栏折叠/Toast/启动屏状态
│ └── components/
│ ├── Icon.vue # 通用 SVG 图标渲染组件
│ ├── Sidebar.vue # 左栏(折叠态 + 目录树 a11y)
│ ├── SearchBar.vue # 顶栏(Logo + 搜索框 + 索引指示器 + 主题切换)
│ ├── FileList.vue # 中栏(面包屑 + 排序 + 文件网格 + 状态栏)
│ ├── FileRow.vue # 文件行(类型色底 + 相似度徽章)
│ ├── InfoPanel.vue # 右栏详情(匹配片段 + 相似文件 + 关键词标签)
│ ├── SearchResultsPanel.vue # 右栏搜索结果(过滤 + 渐变相似度条)
│ ├── CommandPalette.vue # Ctrl+K 命令面板(玻璃态弹层 + 键盘导航)
│ ├── SkeletonBar.vue # 骨架屏原子组件
│ └── Toast.vue # 全局 Toast(玻璃态 + aria-live)
├── src-tauri/ # Rust 后端
│ ├── tauri.conf.json # Tauri 配置(窗口 1200×800,最小 900×600)
│ ├── Cargo.toml # Rust 依赖
│ ├── src/
│ │ ├── lib.rs # Tauri 命令注册
│ │ ├── main.rs # 程序入口
│ │ ├── commands.rs # 12 个 Tauri 命令实现
│ │ ├── index.rs # 索引/搜索/相似文件核心逻辑
│ │ ├── cache.rs # 增量缓存
│ │ └── embed.rs # ONNX 嵌入模型推理
│ └── models/ # ONNX 模型文件(脚本生成)
│ ├── bge-small-zh-int8.onnx # INT8 量化模型(实际使用)
│ ├── bge-small-zh.onnx # FP32 原模型
│ └── tokenizer.json # 分词器
└── scripts/
├── download_model.py # 下载并转换 bge-small-zh 为 ONNX
└── quantize_model.py # INT8 量化
npm run dev # 仅启动前端 Vite dev server(端口 1420)
npm run tauri dev # 启动完整 Tauri 开发模式(前后端联调)
npm run build # 前端类型检查 + 生产构建(产物在 dist/)
npm run tauri build # 完整发行版构建(产物在 src-tauri/target/release/bundle/)npx vue-tsc --noEmit所有颜色、字体、圆角、阴影、动画时长都通过 CSS 变量定义在 src/style.css 的 @theme 块中。亮色主题覆盖在 .light 选择器下。修改令牌后整个应用自动同步。
- 在
src/utils/fileIcon.ts的getFileCategory()中添加扩展名映射 - 如需新图标,在
src/utils/icons.ts中添加 SVG path 数据 - 在
src/style.css的@theme中添加对应的--color-type-xxx和--color-type-xxx-bgtoken
- 在
src-tauri/src/commands.rs中实现pub async fn xxx_cmd(...) - 在
src-tauri/src/lib.rs的invoke_handler!中注册 - 在前端用
import { invoke } from '@tauri-apps/api/core'调用
以下数据来自开发机实测,仅供参考,实际表现取决于硬件与文件内容。
| 场景 | 量级 | 耗时 |
|---|---|---|
| 关键词索引建立 | 1000 文件 | ~3 秒 |
| 语义索引建立 | 1000 文件 | ~60 秒(含嵌入推理) |
| 增量重建(无变更) | 1000 文件 | <1 秒 |
| 关键词搜索 | 10k 文件索引 | <50ms |
| 语义搜索 | 10k 文件索引 | ~200ms |
| 相似文件查询 | 10k 文件索引 | ~150ms |
| 内存占用(运行时) | - | ~300-500 MB(含模型) |
Q:首次启动很慢? A:Rust 首次编译需要数分钟,之后增量编译很快。模型加载约 2-5 秒。
Q:搜索结果为空? A:检查是否已建立索引(底部状态栏应有绿色圆点和文件数),且搜索词不为空。
Q:语义搜索不工作? A:需要点击状态栏的「✨+语义」按钮建立语义索引,建立完成后按钮文字变为「✨刷新语义」。
Q:相似文件不显示? A:需同时满足:① 已启用语义索引 ② 处于搜索模式 ③ 选中了一个文件 ④ 后端找到了相似结果。
Q:模型文件丢失?
A:重新运行 python scripts/download_model.py 和 python scripts/quantize_model.py,模型文件会重新生成到 src-tauri/models/。
Q:如何切换主题?
A:点击顶栏右侧的 ☀️/🌙 按钮,或在浏览器控制台执行 localStorage.setItem('filewise-theme', 'light') 后刷新。
本项目代码采用 MIT License (Copyright (c) 2026 Dawni) 开源。
- BGE 嵌入模型权重 (
bge-small-zh-v1.5):由 BAAI 发布,采用 MIT License,明确允许商业用途免费使用。 - ONNX Runtime:由 Microsoft 发布,采用 MIT License。
- 其余第三方 crate / npm 包的许可证见各自仓库。
- BAAI/bge-small-zh-v1.5 — 中文嵌入模型
- Tauri — 跨平台桌面框架
- Vue.js — 渐进式前端框架
- Tailwind CSS — 原子化 CSS 框架
- Lucide — 图标库(ISC License,本项目本地化使用)
- Inter / JetBrains Mono — 字体

