混合搜索
混合搜索(Hybrid Search)将向量搜索与全文搜索结合,同时利用语义相似性和关键词匹配来提升检索质量。
工作原理
混合搜索同时执行两路检索:
- 向量搜索 — 基于嵌入向量的语义相似性,找到语义上最接近的结果。
- 全文搜索 — 基于关键词的倒排索引匹配,找到包含特定词汇的结果。
两路结果通过重排序算法(如 Reciprocal Rank Fusion)合并,综合排序后返回最终结果。
前置条件
混合搜索需要同时创建向量索引和全文索引:
import * as lancedb from "@lancedb/lancedb";
const db = await lancedb.connect("lanbuff://127.0.0.1:7001");
const tbl = await db.createTable("documents", [
{ vector: [0.1, 0.2, 0.3], title: "Rust 编程", content: "Rust 是一门系统编程语言,注重安全性和性能" },
{ vector: [0.4, 0.5, 0.6], title: "向量检索", content: "向量检索通过计算向量间的距离来找到相似的数据" },
{ vector: [0.7, 0.8, 0.9], title: "全文搜索", content: "全文搜索使用倒排索引实现高效的关键词匹配" },
{ vector: [0.2, 0.3, 0.4], title: "混合搜索", content: "混合搜索结合向量搜索和全文搜索的优势" },
]);
// 创建向量索引
await tbl.createIndex("vector", {
config: lancedb.Index.ivfPq({
numPartitions: 2,
numSubVectors: 1,
}),
});
// 创建全文索引
await tbl.createIndex("content", {
config: lancedb.Index.fts(),
});
执行混合搜索
使用 queryType: "hybrid" 同时传入查询向量和文本:
const results = await tbl
.search([0.1, 0.2, 0.3], { queryType: "hybrid", fullTextQuery: "向量" })
.limit(5)
.toArray();
console.log(results);
带过滤的混合搜索
混合搜索同样支持 SQL 过滤:
const results = await tbl
.search([0.1, 0.2, 0.3], { queryType: "hybrid", fullTextQuery: "搜索" })
.where("title != '全文搜索'")
.limit(5)
.toArray();
选择返回列
const results = await tbl
.search([0.1, 0.2, 0.3], { queryType: "hybrid", fullTextQuery: "Rust" })
.select(["title", "content"])
.limit(5)
.toArray();
适用场景
| 搜索方式 | 优势 | 适用场景 |
|---|---|---|
| 向量搜索 | 语义理解,能找到意思相近但用词不同的结果 | 语义搜索、推荐系统 |
| 全文搜索 | 精确关键词匹配,对专有名词和术语效果好 | 文档检索、日志搜索 |
| 混合搜索 | 兼顾语义和关键词,综合效果最佳 | RAG 应用、知识库问答 |
注意事项
- 混合搜索需要同时存在向量索引和全文索引才能发挥最佳效果。
- 如果只有向量索引,混合搜索会退化为纯向量搜索。
- 如果只有全文索引,混合搜索会退化为纯全文搜索。
- 重排序算法会自动处理两路结果的合并与去重。