智能搜索
个人、本地优先的知识管理系统。将您的文档、笔记、电子表格等索引到可搜索的知识库中,该知识库与本地运行的所有内容相连接——Claude Code(MCP)、桌面应用程序、REST API或CLI。完全在您的机器上运行:没有云,没有GPU,没有订阅。
版本: 0.13.1 | 许可证: 麻省理工学院
______________________________________________________________________
为什么选择智能搜索?
你的知识分散在笔记、PDF、幻灯片和电子表格中。智能搜索将它结合在一起:
- 在本地搜索所有内容。 通过混合搜索(语义+关键字+重新排序)将14种文档格式编入一个知识库。无论你记得确切的短语还是只是概念,都要找到你需要的东西。
- 用你的工具连接。 用于Claude Code的MCP服务器,用于脚本和自动化的REST API,用于高级用户的CLI,用于可视化管理的桌面应用程序。一个索引,多个接口。
- 保持反应灵敏。 所有繁重的工作都在一个进程外的Python服务器中运行。你的编辑器、黑曜石保险库、桌面——在索引过程中没有任何东西会冻结。
- 拥有你的数据。 所有内容都保留在磁盘上——LanceDB矢量和SQLite元数据位于本地目录中。没有云同步,没有遥测,没有帐户。麻省理工学院许可。
- 保持轻便。 ONNX嵌入延迟加载和自动GPU加速。模型在搜索时加载,在CPU上空闲60秒后卸载(保持驻留在GPU上)。200MB以下的稳态RAM。
______________________________________________________________________
特性
搜索
- 混合搜索 (默认):通过互易秩融合、交叉编码器重新排序和MMR多样性选择将向量相似性与FTS5关键字匹配相结合
- 交叉编码器重新排序:使用TinyBERT-L-2对(查询、文档)对进行联合评分,其精度高于单独使用双编码器相似性(+5-15nDCG@10在基准测试中)
- MMR多样性:消除同一文档中的冗余块,确保结果涵盖不同的信息
- 语义模式:具有可配置相关性阈值的纯矢量搜索
- 关键字模式:通过SQLite FTS5进行BM25排名,去除搬运工词干和停用词
- 文件夹筛选:将结果限制到特定目录
- 查找相关:通过平均块嵌入来发现类似的文档
- 搜索管道架构:完整检索管道的交互式可视化图
支持的文件
| 类别 | 格式 |
|---|---|
| 文件 | .pdf, .docx, .epub |
| 电子表格 | .xlsx, .xls, .csv |
| 演示文稿 | .pptx |
| 电子邮件 | .msg |
| 文本 | .md, .txt |
| Web | .html, .htm |
| 数据 | .json, .jsonl |
| 笔记本电脑 | .ipynb |
索引
- 14种格式:所有通过MarkItDown转换的非Markdown文件,然后按标题分块
- 仅关键字索引:在FTS5中索引的结构化文件(CSV、XLSX、JSON),用于关键字搜索,无需向量嵌入
- 持续转换工作者:用于二进制文件转换的长期子进程--消除了Windows上每个文件进程的创建开销
- 后台索引:无阻塞,每个文件夹进度、取消和重新启动时自动恢复
- 基于哈希的数据消除:未更改的文件将自动跳过
- 持久索引日志:存储在SQLite中的文件状态(已索引/失败),在服务器重新启动并重试每个文件后仍然有效
- 短暂指数:创建临时
.smart-search/任何文件夹内的索引
桌面应用
- 让V 2+反应 带有暖暗主题的桌面应用程序
- 快速搜索:
Ctrl+Space全局热键打开浮动搜索覆盖(可配置快捷方式) - 仪表盘:索引统计信息、每个文件夹的状态、模型下载进度
- 文件夹管理器:通过拖放添加/删除监视目录
- 索引日志:包含状态、错误详细信息、每个文件重试次数和在默认应用程序中打开的持久文件日志
- 设置:字体缩放、嵌入模型选择、Matryoshka维度选择器、相关性阈值、自动启动、MCP注册
- 维修指数:一键维护(孤立删除、FTS5重建、LanceDB压缩、兼容性检查)
- 窗口状态:记住会话之间的大小和位置
- 优雅关闭:当桌面应用程序关闭时,服务器通过HTTP信号干净地退出
- 系统托盘:带托盘图标的后台操作
嵌入
- 默认模型:雪花型实际嵌入式m-v2.0(int8 ONNX,297MB,0.554 MTEB检索)
- 套娃截断:默认256暗,可按型号配置
- 延迟加载:模型按需加载,60秒空闲后卸载以释放RAM
- 管理登记处:具有质量/大小元数据的可切换模型
- GPU自动检测:CUDA和DirectML加速在可用时自动使用,否则CPU回退
建筑
- 进程外:Python中的所有繁重工作,黑曜石/桌面保持响应
- MCP服务器:用于集成Claude Code的11个工具
- REST API:20个端点
localhost:9742 - 命令行界面:
smart-search带子命令的命令用于所有操作 - 基于文件的存储:LanceDB(向量)+SQLite(元数据+FTS5),无数据库服务器
系统要求
||要求| |--|-------------| |操作系统| Windows 10/11(x64)| |RAM |最小2 GB(约200 MB空闲)| |存储空间|~300 MB(带AI型号)| |运行时|Python 3.11+(捆绑在桌面安装程序中)| |网络|不需要|
______________________________________________________________________
快速开始
先决条件
- Python 3.11+
uv(推荐)或pip
安装
uv pip install git+https://github.com/ekmungi/smart-search.git使用克劳德代码注册
claude mcp add smart-search -- smart-search使用
在克劳德代码中:
"Add C:/Users/me/vault to the knowledge base"
"Search my knowledge base for transformer architecture"
"Find notes related to meeting-notes/2026-03-10.md"______________________________________________________________________
安装选项
选项A:从GitHub安装(推荐)
uv pip install git+https://github.com/ekmungi/smart-search.git或者使用pip:
pip install git+https://github.com/ekmungi/smart-search.git这将创建 smart-search PATH上的命令。
选项B:本地开发安装
git clone https://github.com/ekmungi/smart-search.git
cd smart-search
uv pip install -e ".[dev]"选项C:桌面应用程序
从发布页面下载安装程序。桌面应用程序将Python后端打包为sidecar,不需要安装Python。
验证安装
smart-search stats______________________________________________________________________
MCP服务器设置
使用Claude Code将智能搜索注册为MCP服务器:
方法1: claude mcp add (推荐)
claude mcp add smart-search -- smart-search在虚拟环境中:
claude mcp add smart-search -- /path/to/venv/Scripts/smart-search方法2: .mcp.json 文件
{
"mcpServers": {
"smart-search": {
"command": "smart-search"
}
}
}方法3:Python模块
{
"mcpServers": {
"smart-search": {
"command": "/path/to/python",
"args": ["-m", "smart_search.server"],
"cwd": "/path/to/smart-search"
}
}
}注: 在Windows上,在JSON路径中使用正斜杠或转义反斜杠。
______________________________________________________________________
CLI备忘单
# Index management
smart-search stats # Index stats and data directory
smart-search index ingest /path # Index a file or folder
smart-search index ingest /path --ephemeral # Create a local .smart-search/ index
smart-search index list # List all indexed files
smart-search index rebuild # Re-index all watched directories
smart-search index remove /path # Remove files from index
# Search
smart-search search "query" # Hybrid search (default)
smart-search search "query" --mode semantic # Vector-only search
smart-search search "query" --mode keyword # FTS5 keyword search
smart-search search "query" --folder /path # Search within a folder
smart-search search "query" --limit 5 # Limit results
# Watch directories
smart-search watch list # List watched directories
smart-search watch add /path/to/dir # Add a watch directory
smart-search watch remove /path/to/dir # Remove a watch directory
# Configuration
smart-search config show # Show current configuration
smart-search model show # Show current embedding model
smart-search model set model-name --dim 256 # Change embedding model
# Server
smart-search serve # Start HTTP server (port 9742)
smart-search mcp # Start MCP server (stdio)
# Ephemeral indexes
smart-search temp list # List ephemeral indexes
smart-search temp cleanup /path # Remove an ephemeral index______________________________________________________________________
克劳德代码提示
| 任务 | 提示 |
|---|---|
| 索引文件夹 | “在C:/Users/me/vault中索引我的笔记” |
| 搜索 | “搜索我的知识库以了解法规遵从性” |
| 添加观察文件夹 | “将C:/Users/me/papers添加到观察列表” |
| 删除监视文件夹 | “停止监视C:/Users/me/旧笔记” |
| 查看统计数据 | “显示知识库统计数据” |
| 列出索引文件 | “列出所有索引文件” |
| 查找相关笔记 | “查找与会议笔记相关的笔记/2026-03-10.md” |
| 阅读注释 | “在projects/smart search.md上阅读注释” |
| 强制重新索引 | “使用Force=true重新索引C:/用户/me/vault” |
| 临时索引 | “创建C:/用户/我/下载/论文的临时索引” |
| 搜索温度索引 | “在C:/用户/我/下载/论文中搜索变压器的温度索引” |
| 清理临时索引 | “清理C:/Users/me/Downloads/papers处的临时索引” |
______________________________________________________________________
MCP工具
| 工具 | 说明 |
|---|---|
knowledge_search | 查询搜索、模式(语义/关键字/混合)、文件夹过滤器、文档类型过滤器 |
knowledge_stats | 索引统计:文档、块、大小、格式 |
knowledge_ingest | 索引文件或文件夹(目录背景) |
knowledge_add_folder | 将文件夹添加到观察列表并触发索引 |
knowledge_remove_folder | 停止监视文件夹,可选择删除数据 |
knowledge_list_folders | 列出关注的目录及其状态 |
knowledge_list_files | 列出具有块计数的索引文件 |
find_related | 查找与给定注释类似的文档 |
read_note | 阅读笔记内容(通过MarkItDown支持PDF、DOCX) |
knowledge_temp_index | 在文件夹内创建临时索引 |
knowledge_temp_cleanup | 删除临时索引 |
______________________________________________________________________
REST API
HTTP服务器运行在 localhost:9742 有23个端点:
| 方法 | 端点 | 描述 |
|---|---|---|
| 得到 | /api/health | 服务器运行状况、版本、正常运行时间 |
| 得到 | /api/stats | 指数统计 |
| 得到 | /api/search?q=...&mode=hybrid | 使用模式、文件夹筛选器进行搜索 |
| 得到 | /api/folders | 列出关注的文件夹 |
| 职位 | /api/folders | 添加文件夹(返回202,背景索引) |
| 删除 | /api/folders?path=... | 删除文件夹 |
| 得到 | /api/files | 列出索引文件 |
| 职位 | /api/ingest | 索引文件(同步)或文件夹(202异步) |
| 得到 | /api/indexing/status | 背景索引进度 |
| 得到 | /api/config | 当前配置 |
| PUT | /api/config | 更新配置 |
| 得到 | /api/models | 可用的嵌入模型 |
| 得到 | /api/model/status | 模型缓存状态 |
| 得到 | /api/model/loaded | 模型内存状态 |
| 得到 | /api/find-related?note_path=... | 查找相关文档 |
| 职位 | /api/repair | 运行指标维护(孤儿、FTS5、压缩) |
| 职位 | /api/ephemeral/index | 创建临时索引 |
| 得到 | /api/ephemeral | 列出临时索引 |
| 职位 | /api/retry-failed | 重试失败的文件(清除+重新排队) |
| 职位 | /api/shutdown | 服务器正常关闭 |
| 删除 | /api/ephemeral?folder_path=... | 删除临时索引 |
______________________________________________________________________
配置
数据目录
| OS | 默认路径 |
|---|---|
| 窗户 | %LOCALAPPDATA%\smart-search |
| Linux | ~/.local/share/smart-search |
| macOS | ~/.local/share/smart-search |
覆盖: SMART_SEARCH_DATA_DIR=/custom/path
config.json
存储在数据目录中的持久配置。通过CLI、REST API或桌面设置面板进行管理。
环境变量
所有设置都可以用以下命令覆盖 SMART_SEARCH_ 前缀变量:
| 变量 | 默认值 | 描述 |
|---|---|---|
SMART_SEARCH_EMBEDDING_MODEL | Snowflake/snowflake-arctic-embed-m-v2.0 | 嵌入模型 |
SMART_SEARCH_EMBEDDING_DIMENSIONS | 256 | 向量维度(Matryoshka) |
SMART_SEARCH_WATCH_DIRECTORIES | [] | 观看目录 |
SMART_SEARCH_SEARCH_DEFAULT_MODE | hybrid | 默认搜索模式 |
SMART_SEARCH_RELEVANCE_THRESHOLD | 0.30 | 最小相似度得分(语义模式) |
SMART_SEARCH_CHUNK_MAX_TOKENS | 512 | 每个区块的最大令牌数 |
SMART_SEARCH_SUPPORTED_EXTENSIONS | [".md", ".txt", ".pdf", ".docx", ".epub", ".xlsx", ".xls", ".csv", ".pptx", ".html", ".htm", ".json", ".jsonl", ".msg", ".ipynb"] | 要索引的文件类型 |
SMART_SEARCH_EXCLUDE_PATTERNS | [".git", ".obsidian", "node_modules", ...] | 排除的目录 |
SMART_SEARCH_WATCHER_DEBOUNCE_SECONDS | 2.0 | 文件监视器去抖动 |
SMART_SEARCH_SEARCH_DEFAULT_LIMIT | 10 | 默认结果计数 |
______________________________________________________________________
建筑
所有客户端都连接到 同一HTTP服务器 在端口9742上。服务器是唯一的事实来源——只有一个后端进程。
┌─────────────────────────┐
│ HTTP Server (:9742) │
│ smart-search serve │
│ (FastAPI, 20 endpoints)│
└──────┬──┬──┬────────────┘
│ │ │
┌──────────────┘ │ └──────────────┐
│ │ │
┌──────┴──────┐ ┌──────┴──────┐ ┌──────┴──────┐
│ Desktop UI │ │ MCP Server │ │ CLI │
│ (Tauri v2) │ │ (proxy) │ │ smart-search│
│ fetch() │ │ → :9742 │ │ search/etc │
└─────────────┘ └─────────────┘ └─────────────┘
Started by user Started by Run manually
(or autostart) Claude Code in terminal谁启动HTTP服务器?
- 桌面应用程序正在运行:Tauri应用程序将服务器作为sidecar进程启动。当您从系统托盘退出时,它会杀死服务器。
- 没有桌面应用程序:run
smart-search serve手动操作,否则MCP工具将出现故障。
关键点:MCP服务器不运行自己的后端。它是一个精简的翻译器——MCP协议,HTTP请求 :9742,返回MCP结果。如果HTTP服务器未运行,MCP工具将返回错误。
组件详情
Backend (Python, all share the HTTP server)
http.py / http_routes.py FastAPI app, 20 endpoints
server.py / mcp_client.py MCP server, proxies to HTTP
search.py Hybrid search: vector + FTS5 + RRF + rerank + MMR
fts.py FTS5 keyword search, BM25 ranking
fusion.py Reciprocal Rank Fusion (k=60)
reranker.py Cross-encoder reranking (TinyBERT, lazy-load)
mmr.py Maximum Marginal Relevance diversity selection
query_preprocessor.py Stopword removal (FTS5), query normalization
indexer.py Document ingestion pipeline
conversion_worker.py Persistent subprocess for binary file conversion
markitdown_parser.py File -> Markdown conversion
markdown_chunker.py Heading-based section splitting
embedder.py ONNX embedding with lazy load/unload
store.py LanceDB vectors + SQLite metadata + FTS5
startup.py Orphan reconciliation, FTS5 backfill, repair
watcher.py Watchdog file watcher with debounce
indexing_task.py Background task manager with cancellation
config_manager.py Persistent config.json
Storage (file-based, no database server)
LanceDB vectors/ directory (columnar, sub-50ms search)
SQLite metadata.db (indexed_files + chunks_fts virtual table)
Desktop (Tauri v2)
Rust System tray, sidecar manager, global shortcut
React Dashboard, Folder Manager, Settings, Quick Search数据流
File -> MarkItDown (non-.md) -> Markdown -> MarkdownChunker -> Chunks
-> Embedder -> LanceDB + SQLite FTS5搜索流(混合模式)
Query -> Preprocess (stopwords / normalization)
-> Vector search (LanceDB) ─┐
-> Keyword search (FTS5 BM25) ─┼─> RRF Fusion
-> Cross-Encoder Rerank (TinyBERT, 30-60ms)
-> MMR Diversity (lambda=0.8, Final Results______________________________________________________________________
运行测试
# Fast tests only (default)
pytest
# All tests including slow integration tests
pytest -m ""
# With coverage
pytest --cov=smart_search --cov-report=term-missing425+个测试,涵盖所有模块。慢速测试(标记 @pytest.mark.slow)需要下载ML模型。
______________________________________________________________________
技术栈
| 组件 | 技术 |
|---|---|
| MCP服务器 | FastMCP |
| HTTP服务器 | FastAPI+Uvicorn |
| 文档解析 | MarkItDown(14种格式:PDF、DOCX、XLSX、PPTX、EPUB、CSV、MSG、HTML、TXT、JSON、IPYNB) |
| Markdown解析 | 基于自定义标题的拆分器 |
| 通过ONNX运行时嵌入 | 雪花型实际嵌入m-v2.0 |
| 矢量存储 | LanceDB(基于文件,列式) |
| 元数据+FTS | SQLite(带波特词干的FTS5) |
| 搜索融合 | 互序融合(RRF,k=60) |
| 通过ONNX运行时重新排序 | 交叉编码器/ms-marco-TinyBERT-L-2-v2 |
| 多样性 | 最大边际相关性(MMR,λ=0.8) |
| 文件监视 | 监视器 |
| 桌面 | Tauri v2+React+顺风CSS v4+Motion |
| 构建 | 孵化器(Python)、PyInstaller(sidecar)、NSIS(安装程序) |
______________________________________________________________________
许可证
麻省理工学院
