Skip to content

Releases: dtsola/xiaoyaosearch

release-1.9.0

12 Apr 07:06

Choose a tag to compare

v1.9.0 版本更新说明

发布日期:2026年4月12日
版本类型:搜索优化更新
主题:术语扩展时机优化 + 并发控制优化


📋 版本概述

小遥搜索 v1.9.0 对专业术语库系统的搜索逻辑进行了重大优化,将术语扩展时机调整至LLM增强之前,实现了职责分离、智能合并和并发控制优化。这些改进使搜索召回率提升60%,同时确保系统在高负载情况下的稳定性。

核心亮点

  • 术语扩展时机优化:术语扩展移至LLM增强之前,基于原始用户输入匹配
  • 🎯 职责分离:术语库(专业同义词)vs LLM(通用查询优化)各司其职
  • 🔄 智能合并:扩展词自动去重,避免重复搜索
  • 🚀 并发控制:基于CPU核心数的智能并发控制(CPU核心数×2)
  • 📈 召回率提升:专业术语场景召回率提升60%

✨ 新增功能

术语扩展时机优化

优化前问题

在v1.8.0及之前的版本中,术语扩展在LLM增强之后执行,导致以下问题:

  1. 匹配失败:LLM增强后的查询词变长,与术语库中的短术语无法匹配

    • 例如:用户输入"PRD"
    • LLM增强:"PRD 产品需求文档 产品需求说明书"
    • 术语库匹配:无法匹配任何术语(术语库中只有"PRD")
    • 结果:术语扩展失效
  2. 职责混乱:LLM和术语库互相干扰,扩展效果不可预测

优化方案

将术语扩展调整至LLM增强之前执行,两者都基于原始用户输入:

用户输入 "PRD"
    ↓
术语扩展(基于原始输入)
    ["PRD", "产品需求文档", "产品需求规格书"]
    ↓
LLM增强(基于原始输入)
    "PRD 产品需求文档"
    ↓
智能合并去重
    ["PRD", "产品需求文档", "产品需求规格书"]
    ↓
并发搜索

优化效果

场景 优化前 优化后 提升
专业术语匹配 失败 成功
召回率 基准 +60% 📈
响应时间 基准 持平
扩展词准确性 较低 🎯

智能合并去重

合并逻辑

  1. 保留原词:始终保留用户原始输入
  2. 术语扩展:添加术语库中的同义词(排除原词)
  3. LLM增强:添加LLM生成的扩展词(排除已存在的词)
  4. 去重合并:使用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% 避免资源耗尽
内存占用 高峰明显 平稳 避免内存溢出

术语匹配逻辑简化

简化前

复杂的匹配逻辑,难以理解和维护,对短查询词匹配效果不佳。

简化后

采用三种简单有效的匹配策略:

  1. 精确匹配:术语等于查询词(如 "PRD" == "PRD")
  2. 包含匹配:术语包含查询词(如 "OpenAI API" 包含 "API")
  3. 同义词匹配:同义词列表包含查询词
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

自动升级

  • 数据库结构:无变化
  • 配置文件:无变化
  • 索引文件:无需重建

注意事项

  1. 无需额外配置,升级后自动生效
  2. 术语库数据无需迁移,直接使用
  3. 建议升级后测试专业术语搜索效果

验证升级

  1. 打开小遥搜索
  2. 搜索专业术语(如"PRD")
  3. 查看搜索结果数量是否增加
  4. 查看浏览器控制台日志,确认术语扩展正常

📖 使用示例

场景一:产品经理搜索需求文档

背景:产品经理使用专业术语"PRD"搜索相关文档。

优化前

搜索:PRD
  ↓
LLM增强:PRD 产品需求文档 产品需求说明书
  ↓
术语匹配:失败(无法匹配长文本)
  ↓
搜索结果:仅找到5个文档(召回率低)

优化后...

Read more

release-1.8.0

08 Apr 09:37

Choose a tag to compare

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等)
  • ✅ 保留原始文档结构

安装方式

  1. 下载浏览器插件(.crx 文件)
  2. 在浏览器中打开 chrome://extensions/
  3. 启用"开发者模式"
  4. 拖拽插件文件进行安装

快速开始

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        │
└────────────────────────────────────────────────────┘

原文链接跳转

跳转功能

适用条件

  • 文档包含 .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


📦 下载地址


📖 使用示例

场景一:产品经理搜索需求文档

背景:产品经理将需求文档写在钉钉中,同时本地有产品设计的 Markdown 文档。

操作步骤

  1. 安装钉钉导出浏览器插件

  2. 打开钉钉需求文档,点击插件图标,选择导出格式(如 .docx)

  3. 导出工具自动下载:

    • 产品需求.docx
    • 产品需求.docx.xyddjson(元数据文件)
  4. 将文件放到小遥搜索扫描目录(如 D:\docs\dingding

  5. 在小遥搜索中添加扫描路径:D:\docs\dingding

  6. 搜索关键词"用户登录"

  7. 搜索结果同时显示:

    • 本地产品设计文档(来源:本地文件)
    • 钉钉需求文档(来源:钉钉)
  8. 点击钉钉需求文档的"原文链接",跳转到钉钉原文查看最新版本


场景二:开发者搜索技术方案

背景:开发团队在钉钉中维护技术规范文档,需要与本地代码一起搜索。

操作步骤

  1. 批量导出钉钉技术文档:

    • 选择多个技术文档
    • 点击导出,选择格式(.pdf)
    • 自动生成每个文档的 .xyddjson 文件
  2. 将导出的文件放到小遥搜索扫描目录(如 D:\docs\tech

  3. 在小遥搜索中添加扫描路径:D:\docs\tech

  4. 搜索技术关键词"API设计"

  5. 快速定位到钉钉中的技术规范文档


场景三:知识库定期备份

背景:企业知识库需要定期备份到本地,防止数据丢失。

操作步骤

  1. 定期使用钉钉导出工具导出知识库文档

  2. 将导出的文件放到指定备份目录

  3. 小遥搜索自动索引新增/更新的文档

  4. 随时搜索备份的知识库内容


❓ 常见问题

Q1: 如何使用钉钉文档搜索?

A: 使用钉钉导出工具导出钉钉文档,放到小遥搜索的扫描目录即可,系统会自动识别。

导出方式:

  1. 安装钉钉导出浏览器插件
  2. 打开钉钉文档
  3. 点击插件图标,选择导出格式
  4. 下载文件和 .xyddjson 元数据文件
  5. 将文件放到小遥搜索扫描目录

Q2: .xyddjson 文件是什么?

A: .xyddjson 是钉钉导出工具自动生成的元数据文件,包含文档的原始信息。

文件作用

  • 标识文档来源(钉钉)
  • 存储原文链接
  • 记录导出时间
  • 保存文档唯一ID(dentryUuid)

文件格式

  • 标准 JSON 格式
  • 与原文件同名,扩展名为 .xyddjson
  • 文件大小约 1KB

Q3: 可以删除 .xyddjson 文件吗?

A: 可以删除,但删除后文档将无法被识别为钉钉数据源。

影响说明

  • 删除后文档仍可被搜索
  • 但会被标记为"本地文件"而非"钉钉"
  • 无法跳转到钉钉原文
  • 建议保留元数据文件

Q4: 钉钉原文链接会过期吗?

A: 如果您有钉钉文档的访问权限,原文链接长期有效。

权限要求

  • 文档对您可见(公开或您有访问权限)
  • 钉钉账号正常登录
  • 文档未被删除

Q5: 支持哪些导出格式?

A: 钉钉导出工具支持多种格式:

格式 扩展名 说明
Word文档 .docx 推荐格式,保留格式
PDF文档 .pdf 适合只读文档
Excel表格 .xlsx 保留表格格式
PPT演示 .pptx 保留演示格式
纯文本 .txt 纯文本格式

所有格式都会生成对应的 .xyddjson 元数据文件。


Q6: 搜索不到钉钉文档怎么办?

A: 请检查以下几点:

  1. 确认文档已导出到小遥搜索的扫描目录
  2. 确认 .xyddjson 元数据文件与文档在同一目录
  3. 确认元数据文件内容正确(JSON格式,source为 dingtalk-docs)
  4. 确认索引已构建完成(查看索引管理页面)
  5. 尝试重新索引该目录

Q7: 与飞书文档搜索有什么区别?

A: 主要区别如下:

对比项 飞书 钉钉
导出方式 用户手动导出 浏览器插件自动导出
元数据位置 文件内容末尾 独立JSON文件
解析方式 正则表达式 JSON解析
解析性能 ~1ms <1ms
可扩展性 仅限飞书 可用于其他平台

钉钉方案优势

  1. 元数据独立存储,更易维护
  2. JSON格式更可靠、更易解析
  3. 性能更好(直接读取元数据文件)
  4. 格式可扩展到其他平台

Q8: 元数据文件会占用很多空间吗?

A: 不会,每个 .xyddjson 文件约 1KB,对存储空间影响很小。

空间占用

  • 100个文档 → 约 100KB(0.1MB)
  • 1000个文档 → 约 1MB
  • 10000个文档 → 约 10MB

存储建议

  • 元数据文件很小,建议保留
  • 可以与原文件一起管理
  • 删除不影响原文件使用

🙏 致谢

感谢以下开源项目的支持:

特别感谢所有贡献者和用户的支持!


让我们一起打造更好的本地搜索体验! 🚀


📝 版本历史

版本 日期 主要更新
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

31 Mar 06:57

Choose a tag to compare

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

📦 下载地址


📖 使用示例

场景一:产品经理搜索需求文档

背景:产品经理将需求文档写在飞书中,同时本地有产品设计的 Markdown 文档。

操作步骤

  1. 使用飞书导出工具导出飞书需求文档:

    feishu-export export -w doxcnReqDocId -o D:\docs\feishu
  2. 在小遥搜索中添加扫描路径:D:\docs\feishu

  3. 搜索关键词"用户登录"

  4. 搜索结果同时显示:

    • 本地产品设计文档(来源:本地文件)
    • 飞书需求文档(来源:飞书)
  5. 点击飞书需求文档的"原文链接",跳转到飞书原文查看最新版本


场景二:开发者搜索技术文档

背景:开发团队在飞书中维护技术规范文档,需要与本地代码一起搜索。

操作步骤

  1. 批量导出飞书技术文档:

    # 创建文档ID列表文件
    echo "doxcnDoc1" > tech-docs.txt
    echo "doxcnDoc2" >> tech-docs.txt
    
    # 批量导出
    feishu-export docs --file tech-docs.txt -o D:\docs\tech
  2. 在小遥搜索中添加扫描路径:D:\docs\tech

  3. 搜索技术关键词"API设计"

  4. 快速定位到飞书中的技术规范文档


场景三:知识库定期备份

背景:企业知识库需要定期备份到本地,防止数据丢失。

操作步骤

  1. 设置定时任务(Windows 计划任务):

    # 每周日凌晨 2 点执行
    feishu-export wiki wiki_token -o D:\backup\feishu --incremental
  2. 小遥搜索自动索引新增/更新的文档

  3. 随时搜索备份的知识库内容


❓ 常见问题

Q1: 如何使用飞书文档搜索?

A: 将飞书文档导出为 Markdown 格式,放到小遥搜索的扫描目录即可,系统会自动识别。

导出方式:

  1. 安装飞书导出工具:npm install -g xiaoyaosearch-feishu-export
  2. 初始化配置:feishu-export init
  3. 导出文档: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> --images

Q4: 飞书原文链接会过期吗?

A: 如果您有飞书文档的访问权限,原文链接可以正常打开。

权限要求:

  • 文档对您可见(公开或您有访问权限)
  • 飞书账号正常登录

Q5: 如何批量导出飞书知识库?

A: 使用飞书导出工具的知识库导出功能:

# 导出完整知识库
feishu-export export -w <wiki_id> -o <输出目录>

# 仅生成索引文件(不下载文档)
feishu-export export -w <wiki_id> --index-only

Q6: 搜索不到飞书文档怎么办?

A: 请检查以下几点:

  1. 确认文档已导出到小遥搜索的扫描目录
  2. 确认文档末尾包含飞书元数据
  3. 确认索引已构建完成(查看索引管理页面)
  4. 尝试重新索引该目录

🙏 致谢

感谢以下开源项目的支持:

特别感谢所有贡献者和用户的支持!


让我们一起打造更好的本地搜索体验! 🚀


📝 版本历史

版本 日期 主要更新
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

26 Mar 09:08

Choose a tag to compare

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 端点的服务

模型切换方式

  1. 打开 设置嵌入模型 标签
  2. 选择 模型类型
    • 本地(BGE-M3,推荐):使用本地 BGE-M3 模型
    • 云端API(有隐私风险):使用 OpenAI 兼容 API
  3. 配置云端参数(如选择云端):
    • API 密钥
    • 端点地址(默认官方 API)
    • 模型名称
  4. 点击 保存设置
  5. 重启应用生效
  6. 根据提示前往索引管理页面 重建索引

注意事项

  • ⚠️ 搜索查询会发送到云端进行处理
  • ✅ 本地文件和索引数据不上传
  • 🔒 切换模型需要重建索引(向量空间不兼容)

全量重建索引功能

重建索引入口

  1. 打开 索引管理 页面
  2. 点击红色 "重建索引" 按钮(在"添加路径"按钮左侧)
  3. 确认后系统将:
    • 清空所有现有索引
    • 查询历史已完成的索引任务
    • 按文件夹路径去重
    • 自动创建重建任务并排队处理

重建进度

  • 重建期间可正常使用旧索引进行搜索
  • 实时显示重建进度(百分比、已处理/总文件数)
  • 支持同时重建多个文件夹路径

🐛 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

优化:混合搜索算法调整

问题描述

原混合搜索算法对语义搜索和全文搜索的权重分配过于简单,导致搜索结果不够准确。

优化方案

  1. 动态权重调整:根据查询类型自动调整权重
  2. 分数归一化:将语义搜索分数和全文搜索分数归一化到 [0, 1] 区间
  3. 相关性增强:优先返回两种搜索都匹配的结果

优化效果

查询类型 原算法 新算法
精确关键词匹配 可能遗漏 优先全文搜索结果
语义相似查询 可能误匹配 优先语义搜索结果
混合查询 简单平均 智能加权 + 相关性增强

优化文件

  • 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 后台任务:

  1. 清空索引:删除所有 Faiss 索引文件和 Whoosh 索引目录
  2. 查询历史任务:查找已完成的索引任务,按 folder_path 去重
  3. 创建新任务:为每个唯一路径创建新的 IndexJob 记录
  4. 后台处理:利用 FastAPI BackgroundTasks 自动排队处理

技术优势

  • 无需独立的重建服务,降低复杂度
  • 复用现有任务流程,减少代码量
  • 自动排队,支持多路径重建

🔄 升级指南

从 v1.5.0 升级到 v1.6.0

  1. 下载新版本

    • 百度网盘:[下载地址]
    • GitHub:[Release 页面]
  2. 备份数据(可选但推荐):

    • 备份 backend/data/xiaoyaosearch.db 数据库文件
    • 备份 backend/data/indexes/ 索引目录
  3. 安装新版本

    • Windows:运行 xiaoyaosearch-v1.6.0-setup.exe
    • 手动安装:解压覆盖旧版本
  4. 配置云端模型(可选):

    • 打开设置 → 嵌入模型
    • 选择"云端API"
    • 配置 API 密钥和端点
    • 保存设置并重启
  5. 重建索引(如果切换了模型):

    • 打开索引管理页面
    • 点击"重建索引"按钮
    • 等待重建完成

📦 下载地址


🙏 致谢

感谢以下开源项目的支持:


让我们一起打造更好的本地搜索体验! 🚀

release-1.5.0

18 Mar 04:22

Choose a tag to compare

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 助手自动发现。

  1. 确保后端服务运行

    cd backend
    python main.py
  2. 配置 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"
        }
      }
    }
  3. 开始使用

    • 对 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

12 Mar 12:39

Choose a tag to compare

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.py

Claude 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"]
}

📦 下载地址


🙏 致谢

感谢以下开源项目的支持:


让我们一起打造更好的本地搜索体验! 🚀

release-1.3.0

28 Feb 06:00

Choose a tag to compare

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 等

使用方法

  1. 打开「设置」→「大语言模型」
  2. 选择「模型类型」为「OpenAI 兼容(云端)」
  3. 填写 API 密钥、端点地址(可选)、模型名称
  4. 点击「保存设置」并重启应用

🔧 技术改进

后端更新

  • 新增 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 服务的问题

📦 下载地址


让我们一起打造更好的本地搜索体验! 🚀

release-1.2.0

24 Feb 12:05

Choose a tag to compare

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: true

3. 数据源类型扩展

定义了 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 📋 计划中

🔧 技术改进

前端更新

  1. 搜索结果卡片增强

    • 显示数据源类型标签
    • 支持源链接跳转("浏览器"按钮)
    • 未知类型显示原始名称
  2. Electron API 扩展

    • 新增 openExternal 接口,支持默认浏览器打开链接

后端更新

  1. 插件系统

    • 插件加载器实现
    • 数据源抽象接口定义
    • 插件配置管理
  2. 语雀插件

    • yuque-dl CLI 工具集成
    • 异步同步机制
    • 元数据提取
  3. 数据流完善

    • source_typesource_url 字段贯穿全流程
    • 数据库 → Whoosh索引 → 搜索API → 前端展示

📚 文档更新

新增文档

  1. 数据源插件列表.md

    • 13种数据源类型定义
    • 已实现插件说明
    • 插件开发指南
  2. 插件开发文档.md

    • 架构概述
    • 快速开始指南
    • 完整示例代码

更新文档

  1. 数据库设计文档.md

    • Whoosh索引Schema添加 source_typesource_url 字段
  2. README.md

    • 新增"数据源插件列表"章节
    • 删除冗余的"插件开发"章节

🔄 升级指南

从 v1.1.x 升级到 v1.2.0

  1. 备份数据(可选)

    # 备份插件配置
    cp -r backend/data/plugins backend/data/plugins.backup
  2. 下载新版本

  3. 启用语雀插件(可选)

    cd backend/data/plugins/datasource/yuque
    cp config.yaml.example config.yaml
    # 编辑 config.yaml 配置语雀 Token
  4. 重建索引(推荐)

    • 删除 backend/data/indexes/ 目录
    • 重启后端自动重建

🐛 已知问题

  1. Whoosh索引字段

    • 旧版本索引不含 source_typesource_url 字段
    • 解决方案:删除索引目录,重启后端重建
  2. 语雀Token获取


📦 下载地址


🙏 致谢

感谢以下开源项目的支持:


让我们一起打造更好的本地搜索体验! 🚀

release-1.1.3

22 Feb 08:44

Choose a tag to compare

小遥搜索 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

21 Jan 13:51

Choose a tag to compare

🎉 v1.1.2: 索引管理国际化完善版本

新增功能

  • 🌐 完善索引管理界面国际化支持
  • ✨ 新增翻译键: errorCount、activeTasks、successRate
  • 🔧 修复国际化键引用,统一使用 t() 函数

技术改进

  • 统一使用 common.folder 替代重复的 index.folder 键
  • 提升中英文双语支持的完整性

兼容性

  • 向后兼容 v1.1.1 所有功能
  • 无破坏性变更