告别 ES 繁琐架构:向量数据库如何用“稀疏向量”终结混合搜索难题?

5 阅读7分钟

你好!我是你的 AI 技术老友。

在搜索和推荐系统的江湖里,Elasticsearch(ES)曾是无可争议的霸主。但随着大模型(LLM)和 RAG(检索增强生成)技术的爆发,开发者们发现,单纯的关键词匹配已经不够用了。我们不仅要“搜得到词”,更要“懂其深意”。

于是,很多团队开始在架构中强行“塞”进一个向量数据库(如 Milvus),形成了“ES 搜词 + 向量数据库搜语义”的“双系统”尴尬局面。今天,我想和大家深度聊聊:为什么这种“缝合怪”架构正在过时?而将两者统一在向量数据库中,又是如何实现性能 30 倍飞跃的?


一、 引言:为什么你的搜索系统需要“升级换代”?

在过去几十年的企业搜索、电商推荐场景中,关键词匹配(全文搜索)一直是默认选择。你搜“苹果手机”,系统就在索引里找包含“苹果”和“手机”的文档。

但 AI 浪潮改变了这一切。现在的用户希望:

  1. 搜语义: 输入“适合夏天喝的凉快饮品”,系统能识别出“冰镇西瓜汁”和“绿豆汤”,即使关键词并不完全匹配。
  2. 搜多模态: 用图片搜图片,用视频搜视频。
  3. RAG 支撑: 给大模型提供最精准的背景知识,避免它“一本正经地胡说八道”。

要实现这些,语义搜索(基于向量嵌入)成了核心。然而,纯粹的语义搜索有时会“想太多”,反而忽略了某些极其精确的专有名词(比如“Python 3.9”或特定的产品型号)。因此,混合搜索(Hybrid Search) ——即“语义理解”+“精确匹配”——成了当下的黄金标准。


二、 技术原理:从“双系统割裂”到“向量化统一”

2.1 稠密向量(Dense Vector):搜索的“灵魂”

在语义搜索中,我们利用深度学习模型(如 BERT、OpenAI Embedding)将文本转换成一串数字,这就是稠密向量

  • 基本原理:每个维度代表一个抽象的特征。在多维空间中,“汽车”和“轿车”这两个点的距离会非常近,而“汽车”和“苹果”则很远。
  • 应用优势:它能够捕捉上下文,处理同义词,是 RAG 架构的基石。

2.2 稀疏向量(Sparse Vector):赋予关键词“向量外壳”

这是本文的核心突破点。过去,关键词搜索依靠“倒排索引”(Inverted Index)。现在,我们可以通过 Sparse-BM25 算法,将关键词的重要性也表达为向量。

  • 基本原理:假设词汇表有 100 万个词。一篇文章只用了 100 个词。那么这篇文档就可以表达为一个 100 万维的向量,但其中 99.99% 的维度都是 0,只有那 100 个词对应的维度有数值(代表词频和权重)。
  • 统一逻辑:既然关键词也能变成向量,那我们为什么不直接用专门优化过向量计算的数据库来统一处理它们呢?

2.3 为什么专用向量数据库(如 Milvus)比 ES 快得多?

很多人会问:“ES 也有向量字段类型,为什么不直接用 ES?”核心区别在于底层引擎的设计哲学

  • 编程语言与内存管理:ES 基于 Java,运行在 JVM 上。在大规模向量检索时,Java 的垃圾回收(GC)机制和内存开销是巨大的负担。而 Milvus 等专为向量设计的数据库底层使用 C++ 或 Go,能实现极其精细的内存控制。
  • 计算架构优化:向量数据库采用了 SIMD(单指令多数据流) 指令集优化,能并行处理海量浮点运算。
  • 索引算法原生成长:ES 的强项是倒排索引,其向量实现(如 HNSW)是后来“补丁式”添加的。而向量数据库原生支持 DiskANN、GPU 加速索引等多种前沿算法。

数据对比: 在 100 万个向量的测试中,ES 的返回延迟约为 200 毫秒,而 Milvus 的托管版本 Zilliz Cloud 仅需 6 毫秒


三、 实践步骤:手把手教你实现统一混合搜索

我们将以开源向量数据库 Milvus 为例,演示如何在一个系统中同时搞定语义搜索和全文搜索。

3.1 第一步:环境准备与 Schema 设计

在统一系统中,我们需要定义一个“双引擎”表结构:一个字段存“稠密向量”(搜语义),一个字段存“稀疏向量”(搜关键词)。

Python

from pymilvus import CollectionSchema, FieldSchema, DataType

# 1. 定义字段:主键、原始文本、稠密向量、稀疏向量
fields = [
    FieldSchema(name="pk", dtype=DataType.INT64, is_primary=True, auto_id=True),
    FieldSchema(name="content", dtype=DataType.VARCHAR, max_length=65535), 
    FieldSchema(name="dense_vector", dtype=DataType.FLOAT_VECTOR, dim=768), 
    FieldSchema(name="sparse_vector", dtype=DataType.SPARSE_FLOAT_VECTOR) 
]

schema = CollectionSchema(fields, "统一混合搜索表")

3.2 第二步:文本向量化(Embedding & Tokenization)

你需要一个 Embedding 模型生成稠密向量,并使用 BM25 算法生成稀疏向量。

如果你不希望在本地费力维护 Embedding 模型服务器,推荐尝试 Zilliz Cloud 的 Pipeline 功能,它可以一键完成从文本到向量的转换,开发者只需关注业务逻辑,无需担心模型部署。】**

3.3 第三步:索引构建

向量数据库之所以快,是因为它会对不同类型的向量构建专门的索引。

Python

# 为稠密向量创建 HNSW 索引
index_params_dense = {
    "index_type": "HNSW",
    "metric_type": "IP", # 内积
    "params": {"M": 16, "efConstruction": 500}
}

# 为稀疏向量创建专用的稀疏倒排索引
index_params_sparse = {
    "index_type": "SPARSE_INVERTED_INDEX",
    "metric_type": "IP"
}

3.4 第四步:执行混合搜索(Hybrid Search)

Milvus 支持在一个请求中同时发起两个方向的搜索,并使用 RRF(Reciprocal Rank Fusion) 算法将结果加权融合。

Python

from pymilvus import AnnSearchRequest, RRFRanker

# 1. 语义搜索请求(稠密向量)
req_dense = AnnSearchRequest(data=[query_dense_vec], anns_field="dense_vector", param=search_params_d, limit=10)

# 2. 关键词搜索请求(稀疏向量)
req_sparse = AnnSearchRequest(data=[query_sparse_vec], anns_field="sparse_vector", param=search_params_s, limit=10)

# 3. 融合搜索结果
res = collection.hybrid_search(
    reqs=[req_dense, req_sparse],
    ranker=RRFRanker(), # 使用 RRF 算法自动平衡两者的排名
    limit=10
)

四、 效果评估:如何验证微调效果?

切换到向量数据库驱动的混合搜索后,你需要从以下三个核心指标来评估系统:

4.1 检索准确率(Relevance)

  • NDCG(归一化折现增益) :衡量搜索结果的相关性排序。
  • 评估方法:对比“纯关键词”、“纯语义”和“混合搜索”在典型测试集(如 MS-MARCO)上的表现。通常混合搜索的 NDCG 会比单一模式高出 10%-15%。

4.2 性能指标(Performance)

  • 吞吐量 (QPS) :在相同硬件下,观察系统每秒能处理多少查询。
  • 延迟 (Latency) :关注 P99 延迟。

4.3 存储与运维成本

  • 内存占用:对比 ES 的 JVM 堆内存与向量数据库的 C++ 内存利用率。
  • 架构复杂度:维护一套系统(单一 API、统一安全策略)比维护两套系统要节省至少 50% 的运维人力。

五、 总结与展望

5.1 核心结论

Elasticsearch 在传统的全文检索领域依然优秀,但面对 AI 驱动的、高并发、低延迟 的现代需求,它已经显露出“英雄迟暮”的疲态。

  • 向量数据库 通过统一稠密向量和稀疏向量,不仅简化了架构,更在性能上实现了降维打击。
  • 统一混合搜索 是 RAG 和智能搜索系统的最终归宿。

5.2 未来展望

我个人比较推荐直接上手做一次微调,比如用 LLaMA-Factory Online 这种低门槛大模型微调平台,把自己的数据真正“喂”进模型里,生产出属于自己的专属模型。

即使没有代码基础,也能轻松跑完微调流程,在实践中理解怎么让模型“更像你想要的样子”。未来,向量数据库将进一步融入更多 AI 能力,比如直接在数据库内完成重排序(Reranking)、甚至集成轻量级的推理引擎。搜索不再只是“寻找”,而是“理解”与“应答”。

想要体验极致的搜索性能?您可以注册 Zilliz Cloud 账号。作为 Milvus 的全托管版本,它不仅性能更强,还提供了自动化索引管理和全球部署能力,助你 5 分钟构建生产级的 AI 搜索应用。


看完这篇文章,你打算把家里的 ES 换成向量数据库吗?欢迎在评论区分享你的看法!