diff --git a/readme.md b/readme.md index 1a86af7..5e318d1 100644 --- a/readme.md +++ b/readme.md @@ -1,4 +1,131 @@ -milisearch +# 轻量级搜索引擎对比 + +本项目对比了三种轻量级全文搜索引擎:**Meilisearch**、**MiniSearch** 和 **FlexSearch**,基于 GitHub Stars 数据集(4000+ 条记录)进行测试。 + +## 功能对比 + +| 特性 | Meilisearch | MiniSearch | FlexSearch | +|------|-------------|------------|------------| +| **类型** | 服务端(需启动服务) | 内存/浏览器端 | 内存/浏览器端 | +| **中文支持** | 内置分词 | 需自定义分词器 | 需自定义分词器 | +| **向量搜索** | 支持(v1.6+) | 不支持 | 不支持 | +| **搜索评分/排名** | 内置 | 内置 | 需 Document 模式 | +| **模糊匹配** | 支持 | 支持 | 支持 | +| **中文分词方案** | cccc/cppej | @node-rs/jieba | @node-rs/jieba | +| **安装体积** | ~20MB + 服务端 | ~100KB | ~50KB | +| **数据源** | starred-repos.json | starred-repos.json | starred-repos.json | + +## 搜索效果对比 + +测试数据:搜索 "资料" + +### MiniSearch +- **分词器**:@node-rs/jieba +- **结果数量**:6 条 +- **特点**:部分 token 匹配也算结果(前缀匹配更宽松) + +### FlexSearch +- **分词器**:@node-rs/jieba +- **结果数量**:2 条 +- **特点**:需要所有 token 完全匹配 + +### Meilisearch +- **特点**:需要启动服务,支持更丰富的搜索功能 + +## 中文分词配置 + +### MiniSearch + @node-rs/jieba + +```typescript +import MiniSearch from 'minisearch' +import { Jieba } from '@node-rs/jieba' + +const jieba = new Jieba() + +const miniSearch = new MiniSearch({ + fields: ['name', 'description', 'author'], + storeFields: ['name', 'description', 'author', 'stars', 'url'], + tokenize: (text) => jieba.cut(text, false), // 使用 jieba 分词 +}) + +miniSearch.addAll(repos) +const results = miniSearch.search('资料') +``` + +### FlexSearch + @node-rs/jieba + +```typescript +import FlexSearch from 'flexsearch' +import { Jieba } from '@node-rs/jieba' + +const jieba = new Jieba() + +const chineseSegment = (text: string): string[] => { + return jieba.cut(text, false) +} + +const index = new FlexSearch.Index({ + tokenize: 'full', + resolution: 9, + encode: chineseSegment, +}) + +repos.forEach((repo) => { + const content = `${repo.name} ${repo.description} ${repo.author}` + index.add(repo.id, content) +}) + +const results = index.search('资料', { limit: 10 }) +``` + +## 运行示例 + +```bash +# MiniSearch +bun run minisearch/index.ts + +# FlexSearch +bun run flexsearch/index.ts +``` + +## 适用场景 + +### 推荐使用 MiniSearch +- 浏览器端搜索 +- 小型数据集(< 100k 文档) +- 需要内置评分排名 +- 快速集成,无需额外服务 + +### 推荐使用 FlexSearch +- 浏览器端搜索 +- 对包体积敏感 +- 需要灵活的索引配置 +- 精确匹配场景 + +### 推荐使用 Meilisearch +- 大型数据集 +- 需要服务端部署 +- 需要向量搜索 +- 需要分布式/高可用 +- 丰富的过滤/排序功能 + +## 局限性 + +| 搜索引擎 | 局限性 | +|---------|-------| +| **MiniSearch** | 不支持向量搜索,中文需额外配置 | +| **FlexSearch** | 无内置评分,Document 模式 API 较复杂 | +| **Meilisearch** | 需要启动服务,增加部署复杂度 | + +## 总结 + +- **轻量级场景**(浏览器端、小数据集):MiniSearch 或 FlexSearch 足够 +- **向量搜索需求**:Meilisearch 或引入独立向量数据库 +- **混合搜索**:可结合关键词搜索 + 向量搜索,使用 RRF 融合算法 + +--- + +## Meilisearch 本地部署 https://www.meilisearch.com/docs/learn/self_hosted/install_meilisearch_locally#windows @@ -14,4 +141,4 @@ services: volumes: - ./data:/meili_data restart: unless-stopped -``` \ No newline at end of file +```