语义搜索

传统全文搜索依赖关键词精确匹配,用户必须"猜对词"才能命中目标文档。Easysearch 语义搜索通过理解文本的语义和上下文关系,让系统能够识别"意思相近"的内容——即使查询与结果不包含相同关键词,也能返回高相关性的搜索结果。


语义搜索 vs 全文搜索 #

对比维度全文搜索(BM25)语义搜索
匹配方式关键词精确/模糊匹配向量空间中的语义相似度
同义词处理需手工配置同义词表模型自动理解同义/近义
长尾查询词汇差异大时召回率低自然语言描述即可获取结果
语言依赖依赖分词器、语言特定配置多语言模型天然支持跨语言
计算成本较高(需 Embedding 计算)

最佳实践:在实际业务中,推荐使用 Hybrid 检索 同时利用两者的优势。


工作原理 #

语义搜索的核心流程:

用户查询 ──→ Embedding 模型 ──→ 查询向量
                                    │
                              k-NN 相似度计算
                                    │
文档库 ──→ Embedding 模型 ──→ 文档向量 ──→ 排序结果
  1. 离线阶段:将文档内容通过 Embedding 模型转换为向量,存入 Easysearch 的向量字段
  2. 在线阶段:用户输入自然语言查询,同样转换为向量,在向量空间中找到最相似的文档
  3. 融合排序:可选地与全文搜索结果融合,输出综合排序

快速上手 #

1. 创建包含向量字段的索引 #

PUT /knowledge-base
{
  "mappings": {
    "properties": {
      "title":   { "type": "text" },
      "content": { "type": "text" },
      "embedding": {
        "type": "knn_dense_float_vector",
        "knn": { "dims": 768 }
      }
    }
  }
}

2. 写入文档与向量 #

将文档内容通过 Embedding 模型(如通义千问、OpenAI 等)转换为向量后写入:

POST /knowledge-base/_doc
{
  "title": "如何配置 Easysearch 集群安全",
  "content": "Easysearch 默认启用安全模块,支持 TLS 加密...",
  "embedding": [0.12, -0.03, 0.88, ...]
}

3. 语义查询 #

POST /knowledge-base/_search
{
  "size": 5,
  "query": {
    "knn_nearest_neighbors": {
      "field": "embedding",
      "vec": {
        "values": [0.15, -0.01, 0.91, ...]
      },
      "model": "lsh",
      "similarity": "cosine",
      "candidates": 50
    }
  }
}

4. Hybrid 检索(推荐) #

将语义搜索与关键词搜索结合,获得更稳定的搜索效果:

POST /knowledge-base/_search
{
  "size": 10,
  "query": {
    "bool": {
      "must": [
        {
          "knn_nearest_neighbors": {
            "field": "embedding",
            "vec": { "values": [0.15, -0.01, 0.91, ...] },
            "model": "lsh",
            "similarity": "cosine",
            "candidates": 100
          }
        }
      ],
      "should": [
        { "match": { "content": "集群安全配置" } }
      ]
    }
  }
}

Embedding 模型选择 #

语义搜索的效果取决于 Embedding 模型的质量。常用模型:

模型维度适用场景
OpenAI text-embedding-3-small1536通用多语言
通义千问 Embedding1024中文优化
BGE / M3E768中文开源
Ollama 本地模型384~4096私有化部署

关于如何接入 Embedding 服务,参见 Embedding 服务集成


搜索效果调优 #

权重调节 #

通过调整全文搜索与向量搜索的权重比例,可以优化不同场景下的搜索效果:

  • 偏语义:适合知识库问答、客服系统,用户输入自然语言
  • 偏关键词:适合日志搜索、精确查找,需要关键词命中
  • 均衡:适合电商搜索,既需要意图理解也需要品牌/型号匹配

可解释与可回滚 #

  • 语义搜索结果可与全文搜索结果对比分析
  • 支持通过规则、权重和策略进行调优
  • 支持渐进式上线和风险控制

应用场景 #

场景说明
企业知识库不需要记住文档标题或关键词,自然语言描述即可定位制度、方案和历史资料
智能问答 / AI 助手通过语义理解检索相关内容,显著提升回答的准确性与上下文相关度
电商搜索用户描述不完整或不精准时,依然返回符合需求的商品
多语言搜索不同语言和表达方式下,匹配到语义相近的内容

相关文档 #