3.7 KiB
3.7 KiB
轻量级搜索引擎对比
本项目对比了三种轻量级全文搜索引擎: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
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
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 })
运行示例
# 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
services:
meilisearch:
image: getmeili/meilisearch:v1.15
container_name: meilisearch
ports:
- "7700:7700"
environment:
- MEILI_ENV=development
volumes:
- ./data:/meili_data
restart: unless-stopped