构建高质量的 RAG(检索增强生成)系统,混合搜索策略是绕不开的技术选型。
纯向量语义搜索虽然能理解用户意图,但在处理精确匹配场景时表现不佳。当用户搜索特定的错误代码、API 方法名或产品序列号时,向量搜索往往会召回大量语义相关但实际无用的结果。
纯 BM25 关键字搜索则相反,它能精确匹配字面内容,但无法理解同义词、上下文和用户的真实意图。搜索"如何优化数据库性能"时,它可能会遗漏那些讨论"提升查询效率"的高质量文档。
混合搜索的价值在于取长补短:向量搜索负责语义理解和意图识别,BM25 负责精确匹配和关键词锚定。两者结合,才能在 RAG 系统中实现高召回率和高准确率的平衡。
MeiliSearch:轻量级的混合检索引擎
MeiliSearch 是一个基于 Rust 开发的开源搜索引擎,采用单体架构设计。它基于 LMDB 存储引擎和 HNSW 向量算法,从底层就原生支持全文检索和向量搜索的统一处理。
主要特点:
-
• 单一二进制文件,无外部依赖 -
• 5 分钟 Docker 启动,2 核 4GB 即可运行 -
• 原生支持混合检索,开箱即用 -
• 支持 OpenAI、Hugging Face、Ollama 等多种向量模型

混合检索方案
MeiliSearch 通过semanticRatio参数控制向量搜索和 BM25 关键字搜索的权重比例,取值范围 0.0 到 1.0:
-
• 0.0:纯关键字搜索,适合精确匹配场景(API 文档、错误码查询) -
• 0.5:平衡模式,适合知识库问答 -
• 1.0:纯语义搜索,适合客服问答、内容推荐
底层会并行执行向量检索和 BM25 检索,根据 semanticRatio 加权融合,返回统一的排序列表。开发者只需调整一个参数,就能适配不同场景。
Milvus:RAG 领域的事实标准
在向量数据库领域,Milvus 是 RAG 系统的事实标准。它由 Zilliz 开源,是 LF AI & Data 基金会的毕业项目,在全球范围内有广泛的企业级应用案例。
Milvus 的优势:
-
• 云原生架构,存储计算分离,支持水平扩展 -
• 可处理数十亿级向量数据 -
• 支持 HNSW、IVF、DiskANN 等多种 ANN 算法 -
• 深度集成 NVIDIA CAGRA,GPU 加速性能极致
但 Milvus 的强大能力也带来了相应的复杂度。
部署和运维成本高:
-
• 需要维护 etcd(元数据存储) -
• 需要维护 MinIO 或 S3(对象存储) -
• 需要维护 Kafka 或 Pulsar(消息队列) -
• 配置文件超过 500 个参数
资源占用大:
-
• 单节点最低配置:8 核 16GB 内存 -
• 生产环境推荐:16 核 32GB 起步 -
• 对象存储和消息队列额外占用资源
对于中小规模的 RAG 应用(文档量在百万级以下),Milvus 的架构显得过于重型。
MeiliSearch vs Milvus 对比:
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MeiliSearch 并不是要取代 Milvus,而是为中小规模场景提供一个更轻量、更易用的选择。相较于 PGVector、SeekDB 等基于传统关系型数据库的向量扩展组件,MeiliSearch 提供了更强大的全文搜索能力和向量搜索能力,更能稳定服务于生产。
Java 实战:从基础到混合搜索
通过 Java 代码演示 MeiliSearch 的完整使用流程。鉴于 MeiliSearch Java SDK 的良好设计,可以非常方便地接入 LangChain4j 和 Spring AI 等 Java AI 框架,为 RAG 应用提供开箱即用的向量检索能力。
1. 添加依赖
<dependency>
<groupId>com.meilisearch.sdk</groupId>
<artifactId>meilisearch-java</artifactId>
<version>0.20.0</version>
</dependency>
2. 初始化客户端
import com.meilisearch.sdk.Client;
import com.meilisearch.sdk.Config;
import com.meilisearch.sdk.Index;
// 创建客户端
Client client = new Client(new Config(
"http://localhost:7700",
"MASTER_KEY" // 替换为你的API密钥
));
// 获取索引
Index index = client.index("Docs");
3. 插入文档
String documents = """
[
{
"id": 1,
"title": "Spring Boot性能优化指南",
"content": "本文介绍如何通过连接池、缓存和异步处理提升Spring Boot应用性能",
"category": "后端开发"
},
{
"id": 2,
"title": "MySQL索引优化实战",
"content": "深入讲解B+树索引原理,以及如何通过explain分析查询性能",
"category": "数据库"
},
{
"id": 3,
"title": "Redis缓存设计模式",
"content": "介绍缓存穿透、缓存雪崩的解决方案,以及分布式锁的实现",
"category": "缓存"
}
]
""";
// 添加文档
TaskInfo taskInfo = index.addDocuments(documents);
// 等待索引完成
client.waitForTask(taskInfo.getTaskUid());
4. 基础关键字搜索
// 简单搜索
SearchResult result = (SearchResult) index.search("性能优化");
// 打印结果
result.getHits().forEach(hit -> {
HashMap<?, ?> doc = (HashMap<?, ?>) hit;
System.out.println("标题: " + doc.get("title"));
});
5. 混合搜索(关键字+语义)
import com.meilisearch.sdk.SearchRequest;
import com.meilisearch.sdk.model.Hybrid;
// 混合搜索:semanticRatio=0.5,关键字和语义各占50%
SearchRequest searchRequest = SearchRequest.builder()
.q("如何提升数据库查询效率")
.hybrid(Hybrid.builder()
.embedder("Ollama") // 使用Ollama本地模型
.semanticRatio(0.5)
.build())
.build();
Searchable result = index.search(searchRequest);
System.out.println("混合搜索结果:");
result.getHits().forEach(hit -> {
HashMap<?, ?> doc = (HashMap<?, ?>) hit;
System.out.println(" -> " + doc.get("title"));
});
图形化管理工具:告别命令行
MeiliSearch 官方未提供可视化管理界面,不像 Milvus 有 Attu 这样的桌面客户端。为了丰富 MeiliSearch 周边生态、提升易用性,我们开源了 meilisearch-desktop,降低了运维门槛。
meilisearch-desktransform: translateY(跨平台桌面客户端
项目地址:https://github.com/ItBayMax/meilisearch-desktop
基于 Tauri 2 + React 打造的跨平台桌面应用,支持 Windows、macOS、Linux。后端采用 Rust 编写,前端使用 TypeScript + React 18,兼顾了原生应用的流畅性和 Web 开发的便捷性。
核心亮点:
-
1. 图形化向量能力配置:MeiliSearch 最新版本能力全部对齐,支持向量嵌入器的可视化配置和查询 -
2. 免编译快速安装:直接从 GitHub Releases 下载对应系统的安装包,双击即可使用,无需配置开发环境 -
3. 原生离线体验:本地直接运行,所有项目配置通过 SQLite 存储在本地,无云依赖,断网也能正常管理 -
4. 轻量高效:Rust 后端让应用启动速度快、内存占用低,相比传统 Electron 应用更轻量,支持最小化到系统托盘
功能覆盖:
-
• 多实例管理:统一管理本地和远程的 MeiliSearch 实例,一键切换

-
• 索引全生命周期:创建、配置、删除索引,支持向量嵌入器配置、排名规则、同义词等所有配置项 -
• 文档批量操作:支持 JSON/CSV/NDJSON 导入,可视化编辑、删除、复制

-
• 任务监控:实时查看索引任务状态,失败任务快速排查 -
• API 密钥管理:可视化创建、管理 API 密钥,支持细粒度权限控制 -
• 多语言+主题:支持中英文界面,深色/浅色主题切换

技术栈:Rust + Tauri 2 + React 18 + TypeScript



