混合搜索

混合搜索(Hybrid Search)将向量搜索与全文搜索结合,同时利用语义相似性和关键词匹配来提升检索质量。

工作原理

混合搜索同时执行两路检索:

  1. 向量搜索 — 基于嵌入向量的语义相似性,找到语义上最接近的结果。
  2. 全文搜索 — 基于关键词的倒排索引匹配,找到包含特定词汇的结果。

两路结果通过重排序算法(如 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 应用、知识库问答

注意事项

  • 混合搜索需要同时存在向量索引和全文索引才能发挥最佳效果。
  • 如果只有向量索引,混合搜索会退化为纯向量搜索。
  • 如果只有全文索引,混合搜索会退化为纯全文搜索。
  • 重排序算法会自动处理两路结果的合并与去重。