向量搜索与语义搜索

向量搜索与语义搜索 #

向量搜索和语义搜索经常被混用,但它们面向的层次不同。理解它们的区别有助于选择正确的方案。

概念区分 #

概念本质Easysearch 中的对应
向量搜索在高维空间中查找最近邻knn_nearest_neighbors 查询
语义搜索按"含义"而非"关键词"检索文本 → Embedding → 向量搜索
Hybrid 检索关键词 + 语义多路召回融合boolknn + match
全文搜索基于 BM25 的词频匹配matchmulti_match

关系:语义搜索 = Embedding 模型 + 向量搜索。向量搜索是底层能力,语义搜索是应用层方案。

什么时候用什么 #

场景推荐方案理由
用户查询关键词明确全文搜索BM25 对精确关键词匹配效果最好
用户用自然语言提问语义搜索Embedding 能捕获同义词和意图
既要关键词又要语义Hybrid 检索两路召回互补,综合效果最好
以图搜图、跨模态向量搜索不同模态映射到同一向量空间
RAG / 知识库问答语义搜索 或 Hybrid为 LLM 提供高质量上下文
推荐系统向量搜索用户/商品特征向量的近邻查找

端到端语义搜索流程 #

                  ┌──────────────┐
用户查询 ──────▶ │ Embedding 模型│ ──────▶ 查询向量
                  └──────────────┘           │
                                             ▼
                                    ┌─────────────────┐
                                    │ knn_nearest_     │
                                    │ neighbors 查询   │
                                    └─────────────────┘
                                             │
                                             ▼
                                    按语义相似度排序的结果
  1. 写入阶段:将文本通过 Embedding 模型转为向量,连同原始字段一起写入索引
  2. 查询阶段:将用户查询通过同一模型转为向量,使用 knn_nearest_neighbors 检索
  3. 融合阶段(可选):将向量相似度得分与 BM25 得分加权融合

Embedding 模型的接入方式参见 Embedding 服务集成

Hybrid 检索示例 #

POST /my-index/_search
{
  "size": 10,
  "query": {
    "bool": {
      "must": [
        {
          "knn_nearest_neighbors": {
            "field": "embedding",
            "vec": { "values": [0.12, -0.03, ...] },
            "model": "lsh",
            "similarity": "cosine",
            "candidates": 100
          }
        }
      ],
      "should": [
        {
          "match": {
            "content": {
              "query": "分布式搜索引擎",
              "boost": 2.0
            }
          }
        }
      ]
    }
  }
}

通过 boost 参数调节关键词得分与向量得分的权重比例。

相关资源 #