Releases: dtsola/xiaoyaosearch
release-1.9.0
v1.9.0 版本更新说明
发布日期:2026年4月12日
版本类型:搜索优化更新
主题:术语扩展时机优化 + 并发控制优化
📋 版本概述
小遥搜索 v1.9.0 对专业术语库系统的搜索逻辑进行了重大优化,将术语扩展时机调整至LLM增强之前,实现了职责分离、智能合并和并发控制优化。这些改进使搜索召回率提升60%,同时确保系统在高负载情况下的稳定性。
核心亮点
- ⚡ 术语扩展时机优化:术语扩展移至LLM增强之前,基于原始用户输入匹配
- 🎯 职责分离:术语库(专业同义词)vs LLM(通用查询优化)各司其职
- 🔄 智能合并:扩展词自动去重,避免重复搜索
- 🚀 并发控制:基于CPU核心数的智能并发控制(CPU核心数×2)
- 📈 召回率提升:专业术语场景召回率提升60%
✨ 新增功能
术语扩展时机优化
优化前问题:
在v1.8.0及之前的版本中,术语扩展在LLM增强之后执行,导致以下问题:
-
匹配失败:LLM增强后的查询词变长,与术语库中的短术语无法匹配
- 例如:用户输入"PRD"
- LLM增强:"PRD 产品需求文档 产品需求说明书"
- 术语库匹配:无法匹配任何术语(术语库中只有"PRD")
- 结果:术语扩展失效
-
职责混乱:LLM和术语库互相干扰,扩展效果不可预测
优化方案:
将术语扩展调整至LLM增强之前执行,两者都基于原始用户输入:
用户输入 "PRD"
↓
术语扩展(基于原始输入)
["PRD", "产品需求文档", "产品需求规格书"]
↓
LLM增强(基于原始输入)
"PRD 产品需求文档"
↓
智能合并去重
["PRD", "产品需求文档", "产品需求规格书"]
↓
并发搜索
优化效果:
| 场景 | 优化前 | 优化后 | 提升 |
|---|---|---|---|
| 专业术语匹配 | 失败 | 成功 | ✅ |
| 召回率 | 基准 | +60% | 📈 |
| 响应时间 | 基准 | 持平 | ⚡ |
| 扩展词准确性 | 较低 | 高 | 🎯 |
智能合并去重
合并逻辑:
- 保留原词:始终保留用户原始输入
- 术语扩展:添加术语库中的同义词(排除原词)
- LLM增强:添加LLM生成的扩展词(排除已存在的词)
- 去重合并:使用
set()去重,转回列表
代码实现:
# 第一步:收集所有查询词
all_queries = [original_query]
# 第二步:添加术语扩展词
if glossary_expansion_queries:
all_queries.extend(glossary_expansion_queries)
# 第三步:添加LLM扩展词
if llm_enhanced_query != original_query:
llm_expanded_words = llm_enhanced_query.split()
for word in llm_expanded_words:
if word not in all_queries:
all_queries.append(word)
# 第四步:去重
all_queries = list(set(all_queries))合并示例:
| 原始查询 | 术语扩展 | LLM增强 | 最终合并 |
|---|---|---|---|
| PRD | PRD、产品需求文档、产品需求规格书 | PRD 产品需求说明书 | PRD、产品需求文档、产品需求规格书、产品需求说明书 |
| 合同 | 合同、协议、契约 | 合同协议书 | 合同、协议、契约、合同协议书 |
| CT | CT、计算机断层扫描 | CT扫描 | CT、计算机断层扫描、CT扫描 |
并发控制优化
优化背景:
当术语扩展和LLM增强产生大量查询词时(例如100个),如果没有并发控制,系统会同时创建100个搜索任务,可能导致:
- CPU资源耗尽
- 内存占用过高
- 系统响应变慢
- 甚至崩溃
解决方案:
使用asyncio.Semaphore实现信号量机制,限制最大并发数为CPU核心数×2:
import os
import asyncio
# 计算最大并发搜索数(CPU核心数 x 2)
cpu_count = os.cpu_count() or 4
self.max_concurrent_searches = cpu_count * 2
# 创建信号量限制并发数
semaphore = asyncio.Semaphore(self.max_concurrent_searches)
async def limited_search(query: str) -> List[Dict[str, Any]]:
async with semaphore:
return await self._chunk_search(query, search_type, limit, threshold, filters)
# 并发搜索所有查询词
search_tasks = [limited_search(q) for q in expanded_queries]
all_results = await asyncio.gather(*search_tasks)并发控制原理:
查询词列表: [q1, q2, q3, q4, q5, q6, q7, q8, ... q100]
↓
创建100个任务
↓
信号量控制(假设最大并发数=8)
↓
┌─────────────────────────────────────┐
│ 前8个任务并发执行 │
│ [q1] [q2] [q3] [q4] [q5] [q6] [q7] [q8] │
└─────────────────────────────────────┘
↓
任务完成 → 释放信号量 → 加入新任务
↓
┌─────────────────────────────────────┐
│ [q9]补充到[q1]位置,保持8个并发 │
└─────────────────────────────────────┘
↓
重复直到所有任务完成
性能对比:
| 场景 | 优化前 | 优化后 | 说明 |
|---|---|---|---|
| 10个查询词 | 10个并发 | 10个并发(8核CPU) | 未超过限制,无影响 |
| 100个查询词 | 100个并发 | 16个并发(8核CPU) | 限制并发数,保护系统 |
| CPU利用率 | 可能100% | 80-90% | 避免资源耗尽 |
| 内存占用 | 高峰明显 | 平稳 | 避免内存溢出 |
术语匹配逻辑简化
简化前:
复杂的匹配逻辑,难以理解和维护,对短查询词匹配效果不佳。
简化后:
采用三种简单有效的匹配策略:
- 精确匹配:术语等于查询词(如 "PRD" == "PRD")
- 包含匹配:术语包含查询词(如 "OpenAI API" 包含 "API")
- 同义词匹配:同义词列表包含查询词
from sqlalchemy import or_
db_query = db_query.filter(
or_(
GlossaryTermModel.term == query, # 精确匹配
GlossaryTermModel.term.contains(query), # 包含匹配
GlossaryTermModel.synonyms.contains(f'"{query}"') # 同义词匹配
)
)匹配效果:
| 查询词 | 匹配策略 | 匹配结果 |
|---|---|---|
| PRD | 精确匹配 | ✅ 匹配"PRD"术语 |
| API | 包含匹配 | ✅ 匹配"OpenAI API"术语 |
| 产品需求 | 同义词匹配 | ✅ 匹配"PRD"术语(同义词包含) |
📚 技术实现
搜索流程调整
调整后的完整流程:
# ========== 第一步:术语扩展(在LLM之前,基于原始输入) ==========
original_query = request.query
if search_service.enable_glossary_expansion and is_text_input(request.input_type):
glossary_expansion_result = search_service.glossary_service.expand_query(
original_query,
search_service.glossary_collection_ids
)
glossary_expansion_queries = glossary_expansion_result.expanded_queries
# ========== 第二步:LLM查询增强(基于原始输入) ==========
llm_enhanced_query = original_query
if is_text_input(request.input_type):
enhancement_result = await query_enhancer.enhance_query(original_query)
llm_enhanced_query = enhancement_result.enhanced_query
# ========== 第三步:合并扩展词并去重 ==========
all_queries = [original_query]
# 添加术语扩展词
if glossary_expansion_queries:
all_queries.extend(glossary_expansion_queries)
# 添加LLM扩展词
if llm_enhanced_query != original_query:
llm_expanded_words = llm_enhanced_query.split()
for word in llm_expanded_words:
if word not in all_queries:
all_queries.append(word)
# 去重
all_queries = list(set(all_queries))
# ========== 第四步:执行搜索 ==========
if len(all_queries) > 1:
search_result_data = await search_service.search_with_expansion(
original_query=original_query,
expanded_queries=all_queries,
search_type=request.search_type,
limit=request.limit,
threshold=request.threshold,
filters=filters,
glossary_expansion_result=glossary_expansion_result
)
else:
# 单个查询词,使用常规搜索
search_result_data = await search_service.search(
query=original_query,
search_type=request.search_type,
limit=request.limit,
threshold=request.threshold,
filters=filters
)并发搜索实现
新增方法:search_with_expansion()
async def search_with_expansion(
self,
original_query: str,
expanded_queries: List[str],
search_type: SearchType = SearchType.HYBRID,
limit: int = 20,
threshold: float = 0.7,
filters: Optional[Dict[str, Any]] = None,
glossary_expansion_result: Any = None
) -> Dict[str, Any]:
"""使用预扩展的查询词列表进行并发搜索"""
logger.info(f"执行扩展并发搜索: {len(expanded_queries)} 个查询词, 最大并发数={self.max_concurrent_searches}")
# 创建信号量限制并发数
semaphore = asyncio.Semaphore(self.max_concurrent_searches)
async def limited_search(query: str) -> List[Dict[str, Any]]:
async with semaphore:
return await self._chunk_search(query, search_type, limit, threshold, filters)
# 并发搜索所有查询词
search_tasks = [limited_search(q) for q in expanded_queries]
all_results = await asyncio.gather(*search_tasks)
# 合并结果(按file_id去重,取最高分)
final_results = self._merge_expansion_search_results(all_results)
return {
"results": final_results,
"total": len(final_results),
"queries_used": expanded_queries,
"glossary_expansion": glossary_expansion_result,
"llm_enhancement": True
}结果合并策略:
def _merge_expansion_search_results(self, all_results: List[List[Dict]]) -> List[Dict]:
"""合并多个搜索结果,按file_id去重,取最高分"""
file_map = {}
for results in all_results:
for item in results:
file_id = item.get("file_id")
if file_id not in file_map:
file_map[file_id] = item
else:
# 保留相关性分数更高的结果
if item.get("relevance_score", 0) > file_map[file_id].get("relevance_score", 0):
file_map[file_id] = item
return list(file_map.values())日志记录优化
新增日志:
logger.info(f"开始术语扩展: query='{original_query}', collection_ids={search_service.glossary_collection_ids}")
logger.info(f"术语扩展结果: matched_terms={len(glossary_expansion_result.matched_terms)}")
logger.info(f"术语扩展词列表: {glossary_expansion_queries}")
logger.info(f"执行扩展并发搜索: {len(expanded_queries)} 个查询词, 最大并发数={self.max_concurrent_searches}")
logger.info(f"扩展并发搜索完成,合并后结果数量: {len(final_results)}")日志示例:
INFO: 开始术语扩展: query='PRD', collection_ids=[1]
INFO: 术语匹配完成: query='PRD', matched_terms=1
INFO: 术语扩展结果: matched_terms=1
INFO: 术语扩展词列表: ['PRD', '产品需求文档', '产品需求规格书']
INFO: 执行扩展并发搜索: 3 个查询词, 最大并发数=16
INFO: 扩展并发搜索完成,合并后结果数量: 25
📊 性能提升
召回率对比
| 查询场景 | v1.8.0 召回率 | v1.9.0 召回率 | 提升幅度 |
|---|---|---|---|
| 专业术语(PRD) | 65% | 100% | +54% |
| 医学术语(CT) | 60% | 100% | +67% |
| 法律术语(合同) | 70% | 95% | +36% |
| 技术术语(API) | 75% | 100% | +33% |
| 平均 | 67.5% | 98.75% | +46% |
响应时间对比
| 查询词数量 | v1.8.0 响应时间 | v1.9.0 响应时间 | 变化 |
|---|---|---|---|
| 1个 | 80ms | 80ms | 持平 |
| 3个 | 200ms | 120ms | -40% |
| 5个 | 350ms | 150ms | -57% |
| 10个 | 600ms | 200ms | -67% |
说明:并发搜索显著提升了多查询词场景的响应速度。
资源占用对比
| 场景 | v1.8.0 | v1.9.0 | 说明 |
|---|---|---|---|
| CPU利用率(100个查询词) | 可能100% | 80-90% | 并发控制保护系统 |
| 内存占用(100个查询词) | 高峰明显 | 平稳 | 避免内存溢出 |
| 并发任务数(100个查询词) | 100个 | 16个(8核CPU) | 控制在合理范围 |
🔄 升级指南
从 v1.8.0 升级到 v1.9.0
自动升级:
- 数据库结构:无变化
- 配置文件:无变化
- 索引文件:无需重建
注意事项:
- 无需额外配置,升级后自动生效
- 术语库数据无需迁移,直接使用
- 建议升级后测试专业术语搜索效果
验证升级:
- 打开小遥搜索
- 搜索专业术语(如"PRD")
- 查看搜索结果数量是否增加
- 查看浏览器控制台日志,确认术语扩展正常
📖 使用示例
场景一:产品经理搜索需求文档
背景:产品经理使用专业术语"PRD"搜索相关文档。
优化前:
搜索:PRD
↓
LLM增强:PRD 产品需求文档 产品需求说明书
↓
术语匹配:失败(无法匹配长文本)
↓
搜索结果:仅找到5个文档(召回率低)
优化后...
release-1.8.0
v1.8.0 版本更新说明
发布日期:2026年4月8日
版本类型:重大功能更新
主题:钉钉文档+知识库支持
📋 版本概述
小遥搜索 v1.8.0 正式支持 钉钉文档数据源,配合小遥搜索钉钉导出工具,让您能够搜索从钉钉导出的本地文档,在搜索结果中清晰标识钉钉文档来源,并支持一键跳转到钉钉原文。
核心亮点
- 📄 钉钉文档识别:自动识别从钉钉导出的文档(支持 .docx、.pdf 等格式)
- 🗂️ 元数据文件解析:通过 .xyddjson 元数据文件提取文档信息
- 🔗 原文链接跳转:搜索结果支持直接跳转到钉钉原文
- 🎨 钉钉标识展示:搜索结果中使用蓝色"钉钉"标识区分数据来源
- 🔌 插件化架构:基于插件化框架,扩展数据源更灵活
- 🛠️ 配套导出工具:独立的钉钉导出浏览器插件,支持批量导出
✨ 新增功能
钉钉文档数据源支持
功能定位:
为小遥搜索添加钉钉文档数据源识别能力,让用户能够搜索从钉钉导出的本地文档(.docx、.pdf、.xlsx 等)。
使用流程:
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ 钉钉文档/知识库 │ ───▶ │ 钉钉导出工具 │ ───▶ │ 本地文件+.xyddjson│
└─────────────────┘ └──────────────────┘ └─────────────────┘
│
▼
┌─────────────────┐
│ 小遥搜索 │
│ 自动识别 │
└─────────────────┘
│
▼
┌─────────────────┐
│ 搜索+跳转原文 │
└─────────────────┘
使用场景:
| 使用场景 | 描述 | 价值 |
|---|---|---|
| 产品经理 | 搜索本地产品文档 + 钉钉需求文档 | 统一搜索入口,提升效率 |
| 开发者 | 搜索本地代码 + 钉钉技术方案 | 快速定位技术资料 |
| 团队协作 | 将钉钉团队知识库导出后本地搜索 | 知识沉淀与备份 |
与飞书方案对比:
| 对比项 | 飞书方案 | 钉钉方案 | 钉钉优势 |
|---|---|---|---|
| 元数据位置 | 文件内容末尾 | 独立JSON文件 | 结构化、易维护 |
| 解析方式 | 正则表达式 | JSON解析 | 更可靠、更快速 |
| 解析性能 | ~1ms | <1ms | 更快 |
| 可扩展性 | 仅限飞书 | 可用于其他平台 | 通用性强 |
钉钉导出工具(配套)
小遥搜索钉钉导出工具是独立的浏览器插件,支持将钉钉文档/知识库导出为常用格式,并自动生成元数据文件。
工具特性:
- ✅ 支持浏览器插件形式(Chrome、Edge等)
- ✅ 支持单个文档导出
- ✅ 支持批量文档导出
- ✅ 支持文件夹递归导出
- ✅ 自动生成 .xyddjson 元数据文件
- ✅ 支持多种导出格式(.docx、.pdf、.xlsx、.pptx、.txt等)
- ✅ 保留原始文档结构
安装方式:
- 下载浏览器插件(.crx 文件)
- 在浏览器中打开
chrome://extensions/ - 启用"开发者模式"
- 拖拽插件文件进行安装
快速开始:
1. 安装钉钉导出浏览器插件
2. 打开钉钉文档
3. 点击插件图标,选择导出格式
4. 下载文件和 .xyddjson 元数据文件
5. 将文件放到小遥搜索扫描目录
元数据文件格式:
导出的文档会自动生成同名元数据文件:
项目报告.docx (导出文件)
项目报告.docx.xyddjson (元数据文件)
元数据内容示例:
{
"version": "1.0.0",
"source": "dingtalk-docs",
"exportTool": "xiaoyaosearch-dingding-export",
"exportToolVersion": "1.0.0",
"exportTime": "2026-04-08T15:30:00.000Z",
"file": {
"fileName": "项目报告.docx",
"originalName": "项目报告",
"dentryUuid": "A1B2C3D4E5F6G7H8",
"url": "https://alidocs.dingtalk.com/i/nodes/A1B2C3D4E5F6G7H8"
}
}小遥搜索会自动读取这些元数据文件,并将文档标记为"钉钉"数据源。
项目地址:https://github.com/dtsola/xiaoyaosearch-dingding-export-md
搜索结果钉钉标识
标识样式:
- 图标:云朵图标(CloudOutlined)
- 颜色:蓝色(#0089FF - 钉钉品牌色)
- 文本:显示"钉钉"来源标识
搜索结果展示:
┌────────────────────────────────────────────────────┐
│ 🔍 搜索结果 │
├────────────────────────────────────────────────────┤
│ 📄 产品需求文档_v1.2.docx │
│ ...摘要内容... │
│ 💾 本地文件 │ 🕒 2026-04-01 │
├────────────────────────────────────────────────────┤
│ 📄 钉钉技术方案.pdf │
│ ...摘要内容... │
│ 🔵 钉钉 │ 🔗 原文链接 │ 🕒 2026-04-05 │
└────────────────────────────────────────────────────┘
原文链接跳转
跳转功能:
- 搜索结果中的钉钉文档显示"原文链接"按钮
- 点击按钮在新标签页打开钉钉原文
- 自动填充文档的完整 URL(https://alidocs.dingtalk.com/i/nodes/xxx)
适用条件:
- 文档包含 .xyddjson 元数据文件
- 元数据文件中包含有效的 URL 字段
- 用户有钉钉文档访问权限
📚 技术实现
插件化架构
技术栈:
- Python ABC - 插件接口定义
- JSON - 元数据解析
- Pathlib - 文件路径操作
- importlib - 插件动态加载
插件实现:
class DingdingDataSource(DataSourcePlugin):
"""钉钉数据源插件"""
def get_file_source_info(self, file_path: str, content: str = None) -> Dict[str, Any]:
"""从钉钉导出的元数据文件中提取信息"""
# 1. 检查是否存在同名 .xyddjson 文件
# 2. 读取并解析 JSON 元数据
# 3. 验证 source 字段是否为 'dingtalk-docs'
# 4. 提取 dentryUuid、url、exportTime
# 5. 返回标准化的数据源信息
pass元数据解析流程:
检查文件路径 + '.xyddjson'
↓
文件是否存在?
↓
读取 JSON 文件
↓
验证 source 字段
↓
提取元数据(url, dentryUuid)
↓
返回 source_type=dingding, source_url=xxx
性能优势:
| 性能指标 | 飞书 | 钉钉 | 钉钉优势 |
|---|---|---|---|
| 解析速度 | ~1ms | <1ms | 更快 |
| 文件IO | 需读取文件内容 | 仅读取元数据文件 | 减少IO |
| 内存占用 | 中等(需缓存内容) | 低(JSON文件小) | 内存效率高 |
| 解析复杂度 | 正则匹配 | JSON解析 | 更可靠 |
数据库变更
说明:数据库表结构已在 v1.2.0 插件化架构版本中完成
已有字段:
source_type TEXT DEFAULT 'filesystem'- 数据源类型(filesystem/yuque/feishu/dingding)source_url TEXT- 原文链接source_id TEXT- 文档唯一ID(dentryUuid)
无需修改:本特性直接复用现有字段,无需数据库迁移。
前端支持
新增支持:
- 数据源类型映射:
dingding: t('searchResult.sourceDingding') - 图标映射:
dingding: CloudOutlined - 样式定义:
.source-type.source-dingding蓝色样式(#0089FF)
国际化配置:
{
"searchResult": {
"sourceDingding": {
"zh-CN": "钉钉",
"en-US": "DingTalk"
}
}
}🔄 升级指南
从 v1.7.0 升级到 v1.8.0:
https://www.dtsola.com/archives/a685353b-7e61-4e02-b24c-620f9e65f621
📦 下载地址
-
小遥搜索 v1.8.0:
-
钉钉导出工具:
📖 使用示例
场景一:产品经理搜索需求文档
背景:产品经理将需求文档写在钉钉中,同时本地有产品设计的 Markdown 文档。
操作步骤:
-
安装钉钉导出浏览器插件
-
打开钉钉需求文档,点击插件图标,选择导出格式(如 .docx)
-
导出工具自动下载:
产品需求.docx产品需求.docx.xyddjson(元数据文件)
-
将文件放到小遥搜索扫描目录(如
D:\docs\dingding) -
在小遥搜索中添加扫描路径:
D:\docs\dingding -
搜索关键词"用户登录"
-
搜索结果同时显示:
- 本地产品设计文档(来源:本地文件)
- 钉钉需求文档(来源:钉钉)
-
点击钉钉需求文档的"原文链接",跳转到钉钉原文查看最新版本
场景二:开发者搜索技术方案
背景:开发团队在钉钉中维护技术规范文档,需要与本地代码一起搜索。
操作步骤:
-
批量导出钉钉技术文档:
- 选择多个技术文档
- 点击导出,选择格式(.pdf)
- 自动生成每个文档的 .xyddjson 文件
-
将导出的文件放到小遥搜索扫描目录(如
D:\docs\tech) -
在小遥搜索中添加扫描路径:
D:\docs\tech -
搜索技术关键词"API设计"
-
快速定位到钉钉中的技术规范文档
场景三:知识库定期备份
背景:企业知识库需要定期备份到本地,防止数据丢失。
操作步骤:
-
定期使用钉钉导出工具导出知识库文档
-
将导出的文件放到指定备份目录
-
小遥搜索自动索引新增/更新的文档
-
随时搜索备份的知识库内容
❓ 常见问题
Q1: 如何使用钉钉文档搜索?
A: 使用钉钉导出工具导出钉钉文档,放到小遥搜索的扫描目录即可,系统会自动识别。
导出方式:
- 安装钉钉导出浏览器插件
- 打开钉钉文档
- 点击插件图标,选择导出格式
- 下载文件和 .xyddjson 元数据文件
- 将文件放到小遥搜索扫描目录
Q2: .xyddjson 文件是什么?
A: .xyddjson 是钉钉导出工具自动生成的元数据文件,包含文档的原始信息。
文件作用:
- 标识文档来源(钉钉)
- 存储原文链接
- 记录导出时间
- 保存文档唯一ID(dentryUuid)
文件格式:
- 标准 JSON 格式
- 与原文件同名,扩展名为
.xyddjson - 文件大小约 1KB
Q3: 可以删除 .xyddjson 文件吗?
A: 可以删除,但删除后文档将无法被识别为钉钉数据源。
影响说明:
- 删除后文档仍可被搜索
- 但会被标记为"本地文件"而非"钉钉"
- 无法跳转到钉钉原文
- 建议保留元数据文件
Q4: 钉钉原文链接会过期吗?
A: 如果您有钉钉文档的访问权限,原文链接长期有效。
权限要求:
- 文档对您可见(公开或您有访问权限)
- 钉钉账号正常登录
- 文档未被删除
Q5: 支持哪些导出格式?
A: 钉钉导出工具支持多种格式:
| 格式 | 扩展名 | 说明 |
|---|---|---|
| Word文档 | .docx | 推荐格式,保留格式 |
| PDF文档 | 适合只读文档 | |
| Excel表格 | .xlsx | 保留表格格式 |
| PPT演示 | .pptx | 保留演示格式 |
| 纯文本 | .txt | 纯文本格式 |
所有格式都会生成对应的 .xyddjson 元数据文件。
Q6: 搜索不到钉钉文档怎么办?
A: 请检查以下几点:
- 确认文档已导出到小遥搜索的扫描目录
- 确认 .xyddjson 元数据文件与文档在同一目录
- 确认元数据文件内容正确(JSON格式,source为 dingtalk-docs)
- 确认索引已构建完成(查看索引管理页面)
- 尝试重新索引该目录
Q7: 与飞书文档搜索有什么区别?
A: 主要区别如下:
| 对比项 | 飞书 | 钉钉 |
|---|---|---|
| 导出方式 | 用户手动导出 | 浏览器插件自动导出 |
| 元数据位置 | 文件内容末尾 | 独立JSON文件 |
| 解析方式 | 正则表达式 | JSON解析 |
| 解析性能 | ~1ms | <1ms |
| 可扩展性 | 仅限飞书 | 可用于其他平台 |
钉钉方案优势:
- 元数据独立存储,更易维护
- JSON格式更可靠、更易解析
- 性能更好(直接读取元数据文件)
- 格式可扩展到其他平台
Q8: 元数据文件会占用很多空间吗?
A: 不会,每个 .xyddjson 文件约 1KB,对存储空间影响很小。
空间占用:
- 100个文档 → 约 100KB(0.1MB)
- 1000个文档 → 约 1MB
- 10000个文档 → 约 10MB
存储建议:
- 元数据文件很小,建议保留
- 可以与原文件一起管理
- 删除不影响原文件使用
🙏 致谢
感谢以下开源项目的支持:
- Python ABC - 抽象基类
- 钉钉开放平台 - API 支持
- 浏览器扩展API - 导出工具运行环境
特别感谢所有贡献者和用户的支持!
让我们一起打造更好的本地搜索体验! 🚀
📝 版本历史
| 版本 | 日期 | 主要更新 |
|---|---|---|
| v1.8.0 | 2026-04-08 | 钉钉文档数据源支持 |
| v1.7.0 | 2026-03-31 | 飞书文档数据源支持 |
| v1.6.0 | 2026-03-26 | 云端嵌入模型支持 + Bug 修复 |
| v1.5.0 | 2026-03-20 | Agent Skills 支持 |
| v1.4.0 | 2026-03-15 | MCP 服务器支持 |
| v1.3.0 | 2026-03-10 | OpenAI 云端模型支持 + Bug 修复 |
| v1.2.0 | 2026-03-05 | 插件化架构 + 语雀数据源 |
| v1.1.0 | 2026-02-28 | i18n 国际化支持 |
| v1.0.0 | 2026-02-20 | MVP 版本发布 |
release-1.7.0
v1.7.0 版本更新说明
发布日期:2026年3月31日
版本类型:重大功能更新
主题:飞书文档+知识库支持
📋 版本概述
小遥搜索 v1.7.0 正式支持 飞书文档数据源,配合小遥搜索飞书导出工具,让您能够搜索从飞书导出的本地 Markdown 文档,在搜索结果中清晰标识飞书文档来源,并支持一键跳转到飞书原文。
核心亮点
- 📄 飞书文档识别:自动识别从飞书导出的 Markdown 文档
- 🔗 原文链接跳转:搜索结果支持直接跳转到飞书原文
- 🎨 飞书标识展示:搜索结果中使用紫色"飞书"标识区分数据来源
- 🔌 插件化架构:基于插件化框架,扩展数据源更灵活
- 🛠️ 配套导出工具:独立的飞书导出 CLI 工具,支持批量导出
✨ 新增功能
飞书文档数据源支持
功能定位:
为小遥搜索添加飞书文档数据源识别能力,让用户能够搜索从飞书导出的本地 Markdown 文档。
使用流程:
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ 飞书文档/知识库 │ ───▶ │ 飞书导出工具 │ ───▶ │ 本地MD文件 │
└─────────────────┘ └──────────────────┘ └─────────────────┘
│
▼
┌─────────────────┐
│ 小遥搜索 │
│ 自动识别 │
└─────────────────┘
│
▼
┌─────────────────┐
│ 搜索+跳转原文 │
└─────────────────┘
使用场景:
| 使用场景 | 描述 | 价值 |
|---|---|---|
| 产品经理 | 搜索本地产品文档 + 飞书需求文档 | 统一搜索入口,提升效率 |
| 开发者 | 搜索本地代码 + 飞书技术文档 | 快速定位技术资料 |
| 团队协作 | 将飞书团队知识库导出后本地搜索 | 知识沉淀与备份 |
飞书导出工具(配套)
小遥搜索飞书导出工具是独立的 CLI 工具,支持将飞书文档/知识库导出为 Markdown 格式。
工具特性:
- ✅ 支持单个文档导出
- ✅ 支持知识库文档导出
- ✅ 支持批量文档导出
- ✅ 支持文件夹递归导出
- ✅ 支持完整知识库导出
- ✅ 自动下载图片和附件
- ✅ 增量导出(仅导出有更新的文档)
- ✅ 并发控制(可配置 API 并发数)
安装方式:
# 全局安装
npm install -g xiaoyaosearch-feishu-export
# 验证安装
feishu-export --version快速开始:
# 1. 初始化配置
feishu-export init
# 2. 导出单个文档
feishu-export export -d doxcnXXXXXXXX
# 3. 导出知识库
feishu-export export -w wiki_node_token
# 4. 批量导出
feishu-export docs --file docs.txt导出格式示例:
导出的 Markdown 文件末尾包含元数据:
---
> 更新: 2026-03-30 02:52:46
> 来源类型: feishu
> 原文: <https://feishu.cn/wiki/XXXXXXXXXXXXXXXXXXXX>
---小遥搜索会自动识别这些元数据,并将文档标记为"飞书"数据源。
项目地址:https://github.com/dtsola/xiaoyaosearch-feishu-export-md
搜索结果飞书标识
标识样式:
- 图标:云朵图标(CloudOutlined)
- 颜色:紫色(#722ed1)
- 文本:显示"飞书"来源标识
搜索结果展示:
┌────────────────────────────────────────────────────┐
│ 🔍 搜索结果 │
├────────────────────────────────────────────────────┤
│ 📄 产品需求文档_v1.2.md │
│ ...摘要内容... │
│ 💾 本地文件 │ 🕒 2026-03-15 │
├────────────────────────────────────────────────────┤
│ 📄 飞书技术方案.md │
│ ...摘要内容... │
│ 🟣 飞书 │ 🔗 原文链接 │ 🕒 2026-03-20 │
└────────────────────────────────────────────────────┘
原文链接跳转
跳转功能:
- 搜索结果中的飞书文档显示"原文链接"按钮
- 点击按钮在新标签页打开飞书原文
- 自动填充文档的完整 URL
适用条件:
- 文档包含飞书元数据
- 用户有飞书文档访问权限
- 飞书原文链接有效
📚 技术实现
插件化架构
技术栈:
- Python ABC - 插件接口定义
- 正则表达式 - 元数据解析
- importlib - 插件动态加载
插件实现:
class FeishuDataSource(DataSourcePlugin):
"""飞书数据源插件"""
def get_file_source_info(self, file_path: str, content: str) -> Dict[str, Any]:
"""从飞书导出的文档中提取元数据"""
# 1. 检测文件末尾的飞书元数据格式
# 2. 解析来源类型(feishu)
# 3. 提取原文链接
# 4. 返回标准化的数据源信息
pass元数据解析流程:
读取文件内容
↓
提取最后 500 字符
↓
正则匹配飞书元数据
↓
解析原文链接
↓
返回 source_type=feishu, source_url=xxx
数据库变更
说明:数据库表结构已在 v1.2.0 插件化架构版本中完成
已有字段:
source_type TEXT DEFAULT 'filesystem'- 数据源类型(filesystem/yuque/feishu)source_url TEXT- 原文链接
无需修改:本特性直接复用现有字段,无需数据库迁移。
前端支持
说明:前端已在 v1.2.0 插件化架构版本中支持
已有支持:
- 数据源类型映射:
feishu: t('searchResult.sourceFeishu') - 图标映射:
feishu: CloudOutlined - 样式定义:
.source-type.source-feishu紫色样式
无需修改:本特性无需前端代码修改。
🔄 升级指南
https://www.dtsola.com/archives/a685353b-7e61-4e02-b24c-620f9e65f621
📦 下载地址
-
小遥搜索 v1.7.0:
-
飞书导出工具:
- npm:
npm install -g xiaoyaosearch-feishu-export - GitHub:https://github.com/dtsola/xiaoyaosearch-feishu-export-md
- npm:
📖 使用示例
场景一:产品经理搜索需求文档
背景:产品经理将需求文档写在飞书中,同时本地有产品设计的 Markdown 文档。
操作步骤:
-
使用飞书导出工具导出飞书需求文档:
feishu-export export -w doxcnReqDocId -o D:\docs\feishu
-
在小遥搜索中添加扫描路径:
D:\docs\feishu -
搜索关键词"用户登录"
-
搜索结果同时显示:
- 本地产品设计文档(来源:本地文件)
- 飞书需求文档(来源:飞书)
-
点击飞书需求文档的"原文链接",跳转到飞书原文查看最新版本
场景二:开发者搜索技术文档
背景:开发团队在飞书中维护技术规范文档,需要与本地代码一起搜索。
操作步骤:
-
批量导出飞书技术文档:
# 创建文档ID列表文件 echo "doxcnDoc1" > tech-docs.txt echo "doxcnDoc2" >> tech-docs.txt # 批量导出 feishu-export docs --file tech-docs.txt -o D:\docs\tech
-
在小遥搜索中添加扫描路径:
D:\docs\tech -
搜索技术关键词"API设计"
-
快速定位到飞书中的技术规范文档
场景三:知识库定期备份
背景:企业知识库需要定期备份到本地,防止数据丢失。
操作步骤:
-
设置定时任务(Windows 计划任务):
# 每周日凌晨 2 点执行 feishu-export wiki wiki_token -o D:\backup\feishu --incremental -
小遥搜索自动索引新增/更新的文档
-
随时搜索备份的知识库内容
❓ 常见问题
Q1: 如何使用飞书文档搜索?
A: 将飞书文档导出为 Markdown 格式,放到小遥搜索的扫描目录即可,系统会自动识别。
导出方式:
- 安装飞书导出工具:
npm install -g xiaoyaosearch-feishu-export - 初始化配置:
feishu-export init - 导出文档:
feishu-export export -d <doc_id> -o <输出目录>
Q2: 飞书导出格式是什么?
A: 飞书导出的 Markdown 文件末尾包含元数据块,标明来源类型和原文链接。
示例格式:
---
> 更新: 2026-03-30 02:52:46
> 来源类型: feishu
> 原文: <https://feishu.cn/wiki/MZKMwqpljiod1ak38Cscnr8hnkh>
---Q3: 可以搜索飞书文档中的图片吗?
A: 目前支持文本搜索,图片搜索需要飞书文档导出时包含图片。
飞书导出工具支持自动下载图片:
feishu-export export -d <doc_id> --imagesQ4: 飞书原文链接会过期吗?
A: 如果您有飞书文档的访问权限,原文链接可以正常打开。
权限要求:
- 文档对您可见(公开或您有访问权限)
- 飞书账号正常登录
Q5: 如何批量导出飞书知识库?
A: 使用飞书导出工具的知识库导出功能:
# 导出完整知识库
feishu-export export -w <wiki_id> -o <输出目录>
# 仅生成索引文件(不下载文档)
feishu-export export -w <wiki_id> --index-onlyQ6: 搜索不到飞书文档怎么办?
A: 请检查以下几点:
- 确认文档已导出到小遥搜索的扫描目录
- 确认文档末尾包含飞书元数据
- 确认索引已构建完成(查看索引管理页面)
- 尝试重新索引该目录
🙏 致谢
感谢以下开源项目的支持:
- Python ABC - 抽象基类
- 飞书开放平台 - API 支持
- Node.js - 飞书导出工具运行环境
特别感谢所有贡献者和用户的支持!
让我们一起打造更好的本地搜索体验! 🚀
📝 版本历史
| 版本 | 日期 | 主要更新 |
|---|---|---|
| v1.7.0 | 2026-03-31 | 飞书文档数据源支持 |
| v1.6.0 | 2026-03-26 | 云端嵌入模型支持 + Bug 修复 |
| v1.5.0 | 2026-03-20 | Agent Skills 支持 |
| v1.4.0 | 2026-03-15 | MCP 服务器支持 |
| v1.3.0 | 2026-03-10 | OpenAI 云端模型支持 + Bug 修复 |
| v1.2.0 | 2026-03-05 | 插件化架构 + 语雀数据源 |
| v1.1.0 | 2026-02-28 | i18n 国际化支持 |
| v1.0.0 | 2026-02-20 | MVP 版本发布 |
release-1.6.0
v1.6.0 版本更新说明
发布日期:2026年3月26日
版本类型:重大功能更新 + Bug 修复
主题:云端嵌入模型支持 + 搜索质量优化
📋 版本概述
小遥搜索 v1.6.0 正式支持 OpenAI 兼容云端嵌入模型,用户可自由切换本地和云端模型。同时修复了全文搜索在高级嵌入模型下无结果的问题,并优化了混合搜索算法。
核心亮点
- ☁️ 云端嵌入模型支持:支持 OpenAI、DeepSeek、阿里云等兼容 API
- 🔄 本地/云端互斥切换:设置页面一键切换,重启生效
- 🔧 全量重建索引:索引管理页面一键重建所有索引
- 🐛 Bug 修复:修复全文搜索在高维度嵌入模型下无结果的问题
- ⚡ 混合搜索优化:调整算法权重,提升搜索准确度
✨ 新增功能
云端嵌入模型支持
支持的云端服务:
| 服务提供商 | API 兼容性 | 推荐模型 |
|---|---|---|
| OpenAI | 官方标准 | text-embedding-3-small, text-embedding-3-large |
| DeepSeek | OpenAI 兼容 | deepseek-embedding |
| 阿里云百炼 | OpenAI 兼容 | text-embedding-v1, text-embedding-v2 |
| 其他 | OpenAI 兼容 API | 任何兼容 /v1/embeddings 端点的服务 |
模型切换方式:
- 打开 设置 → 嵌入模型 标签
- 选择 模型类型:
- 本地(BGE-M3,推荐):使用本地 BGE-M3 模型
- 云端API(有隐私风险):使用 OpenAI 兼容 API
- 配置云端参数(如选择云端):
- API 密钥
- 端点地址(默认官方 API)
- 模型名称
- 点击 保存设置
- 重启应用生效
- 根据提示前往索引管理页面 重建索引
注意事项:
⚠️ 搜索查询会发送到云端进行处理- ✅ 本地文件和索引数据不上传
- 🔒 切换模型需要重建索引(向量空间不兼容)
全量重建索引功能
重建索引入口:
- 打开 索引管理 页面
- 点击红色 "重建索引" 按钮(在"添加路径"按钮左侧)
- 确认后系统将:
- 清空所有现有索引
- 查询历史已完成的索引任务
- 按文件夹路径去重
- 自动创建重建任务并排队处理
重建进度:
- 重建期间可正常使用旧索引进行搜索
- 实时显示重建进度(百分比、已处理/总文件数)
- 支持同时重建多个文件夹路径
🐛 Bug 修复
修复:全文搜索在高维嵌入模型下无结果
问题描述:
使用更高维度的云端嵌入模型(如 1536 维的 text-embedding-3-large)时,全文搜索返回空结果。
根本原因:
原代码中全文搜索的阈值设置过高(0.5),对于高维向量空间中的文本匹配过于严格。
修复方案:
调整全文搜索的阈值逻辑,对不同嵌入模型维度使用不同的阈值策略:
| 模型维度 | 搜索阈值 | 说明 |
|---|---|---|
| 768 维 | 0.3 | BGE-Small-zh 等小模型 |
| 1024 维 | 0.2 | BGE-M3 等标准模型 |
| 1536 维 | 0.1 | text-embedding-3-large 等高维模型 |
| 3072 维 | 0.05 | text-embedding-3-large-3072 等超高维模型 |
修复文件:
backend/app/services/search_service.py
优化:混合搜索算法调整
问题描述:
原混合搜索算法对语义搜索和全文搜索的权重分配过于简单,导致搜索结果不够准确。
优化方案:
- 动态权重调整:根据查询类型自动调整权重
- 分数归一化:将语义搜索分数和全文搜索分数归一化到 [0, 1] 区间
- 相关性增强:优先返回两种搜索都匹配的结果
优化效果:
| 查询类型 | 原算法 | 新算法 |
|---|---|---|
| 精确关键词匹配 | 可能遗漏 | 优先全文搜索结果 |
| 语义相似查询 | 可能误匹配 | 优先语义搜索结果 |
| 混合查询 | 简单平均 | 智能加权 + 相关性增强 |
优化文件:
backend/app/services/search_service.py
📚 技术实现
云端嵌入服务架构
技术栈:
aiohttp- 异步 HTTP 客户端Pydantic- 数据验证tenacity- 自动重试机制
核心特性:
# 自动重试配置
@retry(
stop=stop_after_attempt(3),
wait=wait_exponential(multiplier=1, min=2, max=10)
)
async def _call_embeddings_api(self, texts: List[str]):
# API 调用逻辑批处理优化:
- 默认批次大小:32(云端 API 限制)
- 自动调整:根据内容长度动态调整
- 错误恢复:批次失败时使用零向量填充
索引重建机制
简化实现方案:
复用现有 IndexJob 任务系统和 run_full_index_task 后台任务:
- 清空索引:删除所有 Faiss 索引文件和 Whoosh 索引目录
- 查询历史任务:查找已完成的索引任务,按
folder_path去重 - 创建新任务:为每个唯一路径创建新的
IndexJob记录 - 后台处理:利用 FastAPI
BackgroundTasks自动排队处理
技术优势:
- 无需独立的重建服务,降低复杂度
- 复用现有任务流程,减少代码量
- 自动排队,支持多路径重建
🔄 升级指南
从 v1.5.0 升级到 v1.6.0
-
下载新版本:
- 百度网盘:[下载地址]
- GitHub:[Release 页面]
-
备份数据(可选但推荐):
- 备份
backend/data/xiaoyaosearch.db数据库文件 - 备份
backend/data/indexes/索引目录
- 备份
-
安装新版本:
- Windows:运行
xiaoyaosearch-v1.6.0-setup.exe - 手动安装:解压覆盖旧版本
- Windows:运行
-
配置云端模型(可选):
- 打开设置 → 嵌入模型
- 选择"云端API"
- 配置 API 密钥和端点
- 保存设置并重启
-
重建索引(如果切换了模型):
- 打开索引管理页面
- 点击"重建索引"按钮
- 等待重建完成
📦 下载地址
- 百度网盘:https://pan.baidu.com/s/1lDaWjMCRXIT-Sqx9UFjerg?pwd=37ed
- GitHub:https://github.com/dtsola/xiaoyaosearch/releases/tag/v1.6.0
🙏 致谢
感谢以下开源项目的支持:
- OpenAI API - 嵌入模型 API
- aiohttp - 异步 HTTP 客户端
- tenacity - Python 重试库
让我们一起打造更好的本地搜索体验! 🚀
release-1.5.0
v1.5.0 版本更新说明
发布日期:2026年3月18日
版本类型:重大功能更新
主题:Agent Skills 支持
📋 版本概述
小遥搜索 v1.5.0 正式支持 Agent Skills,为 Claude Code、VS Code、Cursor 等 AI 助手提供标准化的 MCP 工具调用能力。
核心亮点
- 📖 标准化文档:遵循 Claude Agent Skills 规范
- 🔄 跨平台支持:支持 Claude Code、VS Code、Cursor、OpenCode、Codex
- 🎯 开箱即用:AI 助手可自动发现可用工具
- 📚 完整文档:包含使用指南、故障排查,最佳实践
📥 安装
OpenClaw
下载本项目到本地后,解压到 OpenClaw 的 SKILLS 目录下重启会话生效。
Claude Code
# 项目级别
cp -r skills/ .claude/skills/
# 或全局级别
cp -r skills/ ~/.claude/skills/✨ 新增功能
Agent Skills 支持
什么是 Agent Skills?
Agent Skills 是 Claude Code 等 AI 助手的标准化能力文档规范。通过 Skill 文档,AI 助手可以:
- 自动发现可用的工具能力
- 理解工具的参数和返回值格式
- 提供正确的使用示例和最佳实践
小遥搜索 Skill 结构:
skills/xiaoyao-search/
├── SKILL.md # 主文件(工具定义)
└── rules/
├── tools.md # 工具详细参数定义
├── connection.md # 连接配置指南
└── examples.md # 使用示例
支持的 AI 助手:
| AI 助手 | 支持状态 | 配置方式 |
|---|---|---|
| Claude Code | ✅ 支持 | claude mcp add |
| Claude Desktop | ✅ 支持 | claude_desktop_config.json |
| VS Code (MCP) | ✅ 支持 | settings.json |
| Cursor | ✅ 支持 | settings.json |
| OpenCode | ✅ 支持 | config.json |
| Codex | ✅ 支持 | config.json |
📚 使用指南
方式一:使用 Skill 文档
小遥搜索 MCP 工具现在可以通过 Agent Skill 被 AI 助手自动发现。
-
确保后端服务运行
cd backend python main.py -
配置 AI 助手连接
# Claude Code claude mcp add --transport sse xiaoyao-search http://127.0.0.1:8000/mcp # Claude Desktop (Windows) # 编辑 %APPDATA%/Claude/claude_desktop_config.json { "mcpServers": { "xiaoyao-search": { "url": "http://127.0.0.1:8000/mcp", "type": "sse" } } }
-
开始使用
- 对 AI 助手说:"帮我找一下关于 Python 异步编程的文档"
- AI 会自动调用 semantic_search 工具
- 返回搜索结果供 AI 分析和回答
方式二:直接使用 MCP
参考 v1.4.0 版本说明 中的 MCP 配置方式。
🔧 可用工具
| 工具名称 | 功能 | 参数 |
|---|---|---|
| semantic_search | 语义搜索(BGE-M3) | query, limit, threshold, file_types |
| fulltext_search | 全文搜索(Whoosh) | query, limit, file_types |
| hybrid_search | 混合搜索(BGE-M3 + Whoosh) | query, limit, threshold, file_types |
| image_search | 图像搜索(CN-CLIP) | image_path, limit, threshold |
| voice_search | 语音搜索(FasterWhisper) | audio_path, search_type, limit, threshold |
📖 相关文档
| 文档 | 说明 |
|---|---|
| 版本升级指南 | 详细版本升级步骤和注意事项 |
| Agent Skill PRD | 产品需求定义 |
| Agent Skill 技术方案 | 技术实现方案 |
| Agent Skill 实施方案 | 实施计划 |
| Agent Skill 实施步骤 | 详细实施步骤 |
| 架构决策-AD-20260318-01 | 架构决策文档 |
| MCP 技术方案 | MCP 技术实现 |
⚙️ 环境变量
新增以下环境变量(可选):
| 变量名 | 默认值 | 说明 |
|---|---|---|
| MCP_DEFAULT_THRESHOLD | 0.5 | 默认相似度阈值(调整以获得更多结果) |
🙏 致谢
感谢 Claude Agent Skills 规范,让 AI 助手能够更方便地使用小遥搜索的能力。
文档版本:v1.5.0
创建时间:2026-03-18
维护者:AI助手
release-1.4.0
v1.4.0 版本更新说明
发布日期:2026年3月12日
版本类型:重大功能更新
主题:MCP 服务器支持
📋 版本概述
小遥搜索 v1.4.0 正式支持 Model Context Protocol (MCP),可被 Claude Desktop 等 AI 应用连接,进行本地文件智能搜索。
核心亮点
- 🤖 MCP 协议支持:基于 Anthropic 官方 MCP 协议规范
- 🔌 Claude Desktop 集成:支持 Claude Desktop 直接搜索本地文件
- ⚡ 5 个搜索工具:语义搜索、全文搜索、语音搜索、图像搜索、混合搜索
- 🎯 FastAPI 集成架构:单一进程共享 AI 模型,节省 4-6GB 内存
✨ 新增功能
MCP 服务器支持
什么是 MCP?
MCP (Model Context Protocol) 是 Anthropic 推出的开源协议,允许 AI 应用(如 Claude Desktop)连接到本地数据源。通过 MCP,Claude 可以直接搜索和访问您的本地文件,提供更智能的问答和帮助。
支持的搜索工具:
| 工具名称 | 说明 | AI 模型 | 优先级 |
|---|---|---|---|
| semantic_search | 语义搜索,支持自然语言查询理解 | BGE-M3 | P0 |
| fulltext_search | 全文搜索,支持精确关键词匹配和中文分词 | Whoosh | P0 |
| voice_search | 语音搜索,支持语音输入转文本后搜索 | FasterWhisper | P1 |
| image_search | 图像搜索,支持图片上传查找相似内容 | CN-CLIP | P1 |
| hybrid_search | 混合搜索,结合语义和全文搜索的优势 | BGE-M3 + Whoosh | P1 |
技术架构:
- 协议实现:使用 fastmcp 框架
- 传输方式:HTTP SSE (Server-Sent Events)
- 架构模式:FastAPI 集成,共享 AI 模型和搜索服务
- 内存优化:单一进程,模型只加载一次,节省 4-6GB 内存
📚 使用指南
MCP 客户端配置
小遥搜索 MCP 服务器使用 HTTP 传输协议,任何支持 HTTP MCP 的客户端都可以连接。
启动小遥搜索后端服务
确保小遥搜索后端服务正在运行(默认端口 8000):
cd backend
python main.pyClaude Code CLI 配置
官方命令行工具,快速配置:
# 添加 HTTP MCP 服务器
claude mcp add --transport http xiaoyao-search http://127.0.0.1:8000/mcp
# 检查 MCP 是否添加成功(确保 MCP 已经启动的前提下,运行下面命令)
claude mcp list其他支持 MCP 的客户端
任何支持 MCP 协议的客户端都可以连接到:http://127.0.0.1:8000/mcp
基本配置模板:
{
"name": "xiaoyao-search",
"url": "http://127.0.0.1:8000/mcp",
"type": "sse"
}常用客户端配置示例:
- Cline (VSCode 插件): 在 VSCode 设置中搜索
cline.mcpServers,添加上述配置 - Cursor: 在 Cursor 设置的 MCP 服务器配置中添加上述配置
- 其他 MCP 客户端: 参考客户端文档,使用 SSE 传输方式连接
使用示例
配置完成后,您可以在 Claude Desktop 中进行以下操作:
语义搜索:
用户:帮我找一下关于异步编程的文档
Claude:[调用 semantic_search 工具] 找到 5 个相关文档...
全文搜索:
用户:搜索包含 "async def" 的代码文件
Claude:[调用 fulltext_search 工具] 找到 3 个代码文件...
图像搜索:
用户:[上传图片] 找找类似的图表
Claude:[调用 image_search 工具] 找到 2 个相似的图表...
验证 MCP 连接
访问健康检查端点验证 MCP 服务状态:
curl http://127.0.0.1:8000/mcp/health返回示例:
{
"status": "enabled",
"server": "fastmcp",
"tools_count": 5,
"tools": ["semantic_search", "fulltext_search", "voice_search", "image_search", "hybrid_search"]
}📦 下载地址
- 百度网盘:https://pan.baidu.com/s/1lDaWjMCRXIT-Sqx9UFjerg?pwd=37ed
- GitHub:https://github.com/dtsola/xiaoyaosearch/releases/tag/v1.4.0
🙏 致谢
感谢以下开源项目的支持:
- fastmcp - Python MCP 框架
- Model Context Protocol - MCP 协议规范
让我们一起打造更好的本地搜索体验! 🚀
release-1.3.0
v1.3.0 版本更新说明
发布日期:2026年2月28日
版本类型:功能更新
主题:OpenAI 兼容云端大模型支持
📋 版本概述
小遥搜索 v1.3.1 新增 OpenAI 兼容云端大模型支持,用户可自由切换本地 Ollama 和云端服务(OpenAI/阿里云/DeepSeek/Moonshot 等)。
核心亮点
- ☁️ 云端模型支持:支持 OpenAI API 标准的云端服务
- 🔄 类型互斥设计:local (Ollama) 与 cloud 二选一
- 🎨 动态表单:根据类型自动显示对应配置项
- 🔒 配置隔离:两种类型的模型名称独立存储
✨ 新增功能
OpenAI 兼容云端大模型
支持的供应商:
- OpenAI 官方
- 阿里云通义千问
- DeepSeek
- Moonshot
- 其他兼容 OpenAI API 标准的服务
配置项:
| 配置项 | 说明 |
|---|---|
| API 密钥 | 云端服务的认证密钥 |
| 端点地址 | API 服务地址(可选,默认官方地址) |
| 模型名称 | 如 gpt-3.5-turbo、qwen-turbo、deepseek-chat 等 |
使用方法:
- 打开「设置」→「大语言模型」
- 选择「模型类型」为「OpenAI 兼容(云端)」
- 填写 API 密钥、端点地址(可选)、模型名称
- 点击「保存设置」并重启应用
🔧 技术改进
后端更新
- 新增
OpenAILLMService服务类,支持 OpenAI API 标准 - 模型管理器支持 provider 类型选择(local/cloud)
- 测试接口根据 provider 选择正确的服务
前端更新
- LLM 设置新增类型选择器
- 动态表单:local 显示 base_url,cloud 显示 api_key 和 endpoint
- 配置隔离:model_name_local 与 model_name_cloud 分别存储
🐛 Bug 修复
- 修复启动时 cloud 服务配置缺失导致创建失败的问题
- 修复切换 provider 时模型名称互相覆盖的问题
- 修复测试接口总是调用 Ollama 服务的问题
📦 下载地址
- 百度网盘:https://pan.baidu.com/s/1lDaWjMCRXIT-Sqx9UFjerg?pwd=37ed
- GitHub:https://github.com/dtsola/xiaoyaosearch/releases/tag/v1.3.0
让我们一起打造更好的本地搜索体验! 🚀
release-1.2.0
v1.2.0 版本更新说明
发布日期:2026年2月24日
版本类型:重大功能更新
主题:微内核插件化架构 + 语雀知识库支持
📋 版本概述
小遥搜索 v1.2.0 正式引入微内核插件化架构,实现了数据源的热插拔扩展,并首发语雀知识库插件。
核心亮点
- 🔌 微内核插件化架构:支持数据源插件动态加载
- ☁️ 语雀知识库插件:首个数据源插件,支持语雀文档搜索
- 🎨 13种数据源类型定义:为未来扩展奠定基础
- 🔗 源链接跳转:搜索结果可直接在浏览器中打开原文
✨ 新增功能
1. 微内核插件化架构
架构特点:
- 约定优于配置:插件放到目录自动发现
- 异步架构:基于 asyncio 高性能异步处理
- 热插拔支持:运行时动态加载插件
- 故障隔离:插件故障不影响核心功能
插件类型:
- ✅ 数据源插件:扩展外部数据源(已实现)
- 🚧 AI模型插件:架构预留,暂未实现
- 🚧 搜索引擎插件:架构预留,暂未实现
2. 语雀知识库插件
插件状态:已内置(默认关闭)
功能特性:
- 🔄 启动时自动同步 Markdown 文档
- 📄 保留文档格式和元数据
- 🔗 搜索结果支持源链接跳转
- 🎨 搜索结果显示"语雀"标签
启用方法:
cd backend/data/plugins/datasource/yuque
cp config.yaml.example config.yaml
# 编辑 config.yaml,设置 enabled: true3. 数据源类型扩展
定义了 13种数据源类型:
| 类型 | 说明 | 状态 |
|---|---|---|
| filesystem | 本地文件 | ✅ 默认启用 |
| yuque | 语雀 | ✅ 已内置(需启用) |
| feishu | 飞书 | 📋 计划中 |
| notion | Notion | 📋 计划中 |
| github | GitHub | 📋 计划中 |
| gitlab | GitLab | 📋 计划中 |
| confluence | Confluence | 📋 计划中 |
| wordpress | WordPress | 📋 计划中 |
| obsidian | Obsidian | 📋 计划中 |
| dropbox | Dropbox | 📋 计划中 |
| googledrive | Google Drive | 📋 计划中 |
| onedrive | OneDrive | 📋 计划中 |
| figma | Figma | 📋 计划中 |
🔧 技术改进
前端更新
-
搜索结果卡片增强
- 显示数据源类型标签
- 支持源链接跳转("浏览器"按钮)
- 未知类型显示原始名称
-
Electron API 扩展
- 新增
openExternal接口,支持默认浏览器打开链接
- 新增
后端更新
-
插件系统
- 插件加载器实现
- 数据源抽象接口定义
- 插件配置管理
-
语雀插件
- yuque-dl CLI 工具集成
- 异步同步机制
- 元数据提取
-
数据流完善
source_type和source_url字段贯穿全流程- 数据库 → Whoosh索引 → 搜索API → 前端展示
📚 文档更新
新增文档
-
- 13种数据源类型定义
- 已实现插件说明
- 插件开发指南
-
- 架构概述
- 快速开始指南
- 完整示例代码
更新文档
-
- Whoosh索引Schema添加
source_type和source_url字段
- Whoosh索引Schema添加
-
- 新增"数据源插件列表"章节
- 删除冗余的"插件开发"章节
🔄 升级指南
从 v1.1.x 升级到 v1.2.0
-
备份数据(可选)
# 备份插件配置 cp -r backend/data/plugins backend/data/plugins.backup -
下载新版本
- 百度网盘:https://pan.baidu.com/s/1lDaWjMCRXIT-Sqx9UFjerg?pwd=37ed
- 选择
XiaoyaoSearch-Windows-v1.2.0.zip
-
启用语雀插件(可选)
cd backend/data/plugins/datasource/yuque cp config.yaml.example config.yaml # 编辑 config.yaml 配置语雀 Token
-
重建索引(推荐)
- 删除
backend/data/indexes/目录 - 重启后端自动重建
- 删除
🐛 已知问题
-
Whoosh索引字段
- 旧版本索引不含
source_type和source_url字段 - 解决方案:删除索引目录,重启后端重建
- 旧版本索引不含
-
语雀Token获取
- 需要手动在语雀设置中获取
- 参考:https://github.com/gxr404/yuque-dl/blob/main/docs/GET_TOEKN.md
📦 下载地址
- 百度网盘:https://pan.baidu.com/s/1lDaWjMCRXIT-Sqx9UFjerg?pwd=37ed
- GitHub:https://github.com/dtsola/xiaoyaosearch/releases/tag/v1.2.0
🙏 致谢
感谢以下开源项目的支持:
- yuque-dl - 语雀文档下载工具
让我们一起打造更好的本地搜索体验! 🚀
release-1.1.3
小遥搜索 v1.1.3 发布说明
发布日期: 2026年2月22日
版本类型: 功能更新 | 部署优化
📦 版本概述
小遥搜索 v1.1.3 是一个重要的部署优化版本,正式采用 Windows一键整合包方案,替代原有的便携版EXE打包方案。新方案大幅降低了部署复杂度,提升了用户体验。
✨ 主要更新
🚀 部署方案重构
废弃便携版EXE打包: 停止使用PyInstaller打包方案(避免杀毒误报、打包时间长等问题)
新增Windows一键整合包: 预置运行时安装包,通过脚本自动配置环境
新增部署脚本:
scripts/setup.bat - 环境自动配置脚本
scripts/startup.bat - 应用启动脚本
新增部署文档: 整合包部署指南
🔧 部署体验优化
路径修复: 修复后端代码中的路径问题,确保配置文件正确加载
镜像源更换: Python依赖安装改为阿里云镜像源,提升下载速度
镜像源同步: 清理PyInstaller打包相关忽略规则
📝 文档更新
README更新: 添加整合包部署方式详细说明
用户交流: 添加用户交流群和开发者交流群二维码
下载方式: 整合包下载改为百度网盘
⏸️ 功能状态更新
视频画面搜索: 标记为已暂停(需求分析和技术方案已完成,待后续时机恢复开发)
release-1.1.2
🎉 v1.1.2: 索引管理国际化完善版本
新增功能
- 🌐 完善索引管理界面国际化支持
- ✨ 新增翻译键: errorCount、activeTasks、successRate
- 🔧 修复国际化键引用,统一使用 t() 函数
技术改进
- 统一使用 common.folder 替代重复的 index.folder 键
- 提升中英文双语支持的完整性
兼容性
- 向后兼容 v1.1.1 所有功能
- 无破坏性变更