update
This commit is contained in:
129
readme.md
129
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
|
https://www.meilisearch.com/docs/learn/self_hosted/install_meilisearch_locally#windows
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user