Skip to content

Repository files navigation

FileWise

本地优先的语义文件管理器 — 在文件名搜索之上叠加内容语义搜索,所有 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 量化降低内存占用

隐私

  • 完全离线 — 不依赖任何云服务,模型本地加载,文件内容不外传

🖼 界面预览

FileWise 主界面 - 三栏布局

↑ 三栏主界面:左侧目录树 · 中间文件列表 · 右侧文件详情


FileWise 语义搜索 - 内容匹配片段

↑ 语义搜索:搜「向量」命中「向量嵌入与混合搜索.md」,右侧展示匹配上下文片段

布局结构

应用启动后呈现三栏布局:

┌─────────────────────────────────────────────────────────────┐
│ [Logo] FileWise   [搜索框]              [索引状态] [☀/🌙]    │  ← 玻璃态顶栏
├─────────┬───────────────────────────────┬───────────────────┤
│资源管理器│ ↑  路径 / 文件夹 / 子目录      │  ← 返回搜索结果    │
│         │ [名称][大小][日期]            │  [图标] 文件名     │
│打开文件夹│ ┌─────┐ ┌─────┐ ┌─────┐      │  路径             │
│         │ │ 📁  │ │ 📄  │ │ 🎬  │      │  ━━━━━━━ 78%      │
│快捷访问  │ │folder│ │doc  │ │video│      │  12 KB · 昨天     │
│ 桌面    │ └─────┘ └─────┘ └─────┘      │                   │
│ 文档    │ ┌─────┐ ┌─────┐ ┌─────┐      │  [匹配片段]       │
│ 下载    │ │ 🖼  │ │ 💻  │ │ 📦  │      │  ...向量嵌入...   │
│         │ │img  │ │code │ │zip  │      │                   │
│目录树   │ └─────┘ └─────┘ └─────┘      │  [相似文件]       │
│ ▶ 项目  │                               │   检索原理.md 82%  │
│ ▶ 备份  │                               │   embedding.md 71%│
├─────────┴───────────────────────────────┴───────────────────┤
│ 36 个项目                  ● 1280 文件  ✨刷新语义  🗑        │  ← 状态栏
└─────────────────────────────────────────────────────────────┘

🚀 快速开始

环境要求

安装与运行

# 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

📖 使用指南

1. 打开目录

  • 点击左上角「打开文件夹」按钮选择目录
  • 或点击「快捷访问」中的桌面/文档/下载等系统目录
  • 或在目录树中点击任意层级

2. 建立索引

进入目录后,顶部会出现「建立索引」提示条:

  • 点击「建立索引」开始关键词索引(可选「递归」子目录)
  • 索引完成后,底部状态栏出现绿色圆点和文件数
  • 点击状态栏的「✨+语义」按钮建立语义索引(首次较慢,需调用嵌入模型)

3. 搜索文件

两种方式:

  • 顶部搜索框 — 输入关键词,自动 debounce 300ms 后触发搜索,结果显示在右栏
  • 命令面板 — 按 Ctrl/Cmd + K 唤起,浮层式快速搜索

搜索结果面板功能:

  • 顶部「全部 / 关键词 / 语义」筛选按钮切换匹配类型
  • 每条结果显示:文件名 + 类型图标 + 相似度百分比 + 渐变进度条 + 命中片段
  • 单击:在右栏查看详情(匹配片段、相似文件、关键词标签)
  • 双击:直接打开文件(系统默认程序)
  • 鼠标悬停后出现「定位到文件夹」按钮

4. 查看文件详情

选中文件后右栏显示:

  • 文件类型大图标(按类型上色)
  • 文件名 + 完整路径
  • 匹配度(仅搜索模式,渐变进度条 + 百分比)
  • 文件大小 + 修改时间
  • 匹配片段(搜索模式)— 命中上下文,关键词高亮
  • 相似文件(搜索模式 + 语义索引启用)— 自动推荐语义相近的文件
  • 关键词标签 — 从文件名提取的关键词,命中查询词时高亮

5. 主题切换

点击顶栏右侧的 ☀️/🌙 按钮切换亮/深色主题,选择会保存到 localStorage,下次启动自动恢复。

6. 侧栏折叠

点击侧栏左上角的「面板」图标按钮,侧栏折叠为 56px 图标模式;再次点击恢复。

7. 缓存管理

底部状态栏显示当前缓存文件数与体积,点击 🗑 图标清除所有缓存(包括所有目录的索引和向量)。

8. 快捷键

快捷键 功能
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 选择器下。修改令牌后整个应用自动同步。

添加新文件类型支持

  1. src/utils/fileIcon.tsgetFileCategory() 中添加扩展名映射
  2. 如需新图标,在 src/utils/icons.ts 中添加 SVG path 数据
  3. src/style.css@theme 中添加对应的 --color-type-xxx--color-type-xxx-bg token

添加新 Tauri 命令

  1. src-tauri/src/commands.rs 中实现 pub async fn xxx_cmd(...)
  2. src-tauri/src/lib.rsinvoke_handler! 中注册
  3. 在前端用 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.pypython scripts/quantize_model.py,模型文件会重新生成到 src-tauri/models/

Q:如何切换主题? A:点击顶栏右侧的 ☀️/🌙 按钮,或在浏览器控制台执行 localStorage.setItem('filewise-theme', 'light') 后刷新。


📜 License

本项目代码采用 MIT License (Copyright (c) 2026 Dawni) 开源。

第三方资产声明

  • BGE 嵌入模型权重 (bge-small-zh-v1.5):由 BAAI 发布,采用 MIT License,明确允许商业用途免费使用。
  • ONNX Runtime:由 Microsoft 发布,采用 MIT License
  • 其余第三方 crate / npm 包的许可证见各自仓库。

🙏 致谢

About

本地优先的语义文件管理器 | Local-first semantic file manager

Topics

Resources

Contributing

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages