混合搜索

混合搜索 #

混合搜索结合了关键词搜索和语义搜索,以提升搜索相关性。要实现混合搜索,您需要建立一个在搜索时运行的搜索管道。 该管道会在中间阶段拦截搜索结果,并通过处理流程对文档分数进行归一化和组合处理。

要使用混合搜索,您需要配置搜索管道,添加混合排序处理器。

混合排序处理器 #

混合排序处理器 hybrid-ranker-processor 是一种基于排名的搜索阶段结果处理器,运行在搜索执行的查询阶段和获取阶段之间。它会拦截查询阶段的结果,然后使用 倒数排序融合算法(RRF,Reciprocal Rank Fusion) 来合并不同查询子句,最终生成排序后的搜索结果列表。

适用场景:

  • 需要融合不同搜索技术(如关键词和语义搜索)的结果
  • 子查询的原始分数不可直接比较(如 BM25 和 KNN)

算法原理 #

RRF 是一种多查询融合方法,其核心计算逻辑为:

  1. 对每个文档在不同子结果集给出的排名取倒数(如排名第 k 则得分为 1/(k+60))
  2. 将各子结果集的倒数得分相加,生成统一排序分数
  3. 按最终分数降序输出结果集

RRF 的通用计算公式如下(其中 k 为平滑常数,默认 60,query_j_rank 表示混合查询中某文档在第 j 种查询方法返回结果中的排名):

rankScore(document_i) = sum(1/(k + query_1_rank), 1/(k + query_2_rank), ..., 1/(k + query_j_rank))

请求体字段 #

下表列出了所有可用的请求字段。

字段数据类型说明
combination.techniqueString必填。指定分数组合方式,目前仅支持 rrf(倒数排序融合)。
combination.rank_constantInteger可选。计算倒数得分前,加到文档排名的常量值(必须 ≥ 1)。默认值:60。
- 较大值(如 100)会使分数更均匀,降低高排名结果的影响。
- 较小值(如 10)会增大排名间的分数差异,使高排名结果更具优势。

(注:RRF 算法适用于混合搜索场景,能够平衡关键词搜索和语义搜索的排序结果,提升整体相关性。)

创建混合排序处理器 #

以下请求创建一个搜索管道,其中包含混合排序处理器:

PUT /_search/pipeline/rrf-pipeline
{
  "phase_results_processors": [
    {
      "hybrid-ranker-processor": {
        "combination": {
          "technique": "rrf",
          "rank_constant": 60
        }
      }
    }
  ]
}

rrf-pipeline 仅用于演示,实际使用时建议配置混合搜索管道

配置混合搜索管道 #

为充分发挥混合搜索的优势,建议配置语义查询增强处理器 semantic_query_enricher,通过结合关键词搜索的精确匹配能力和语义搜索的上下文理解能力,提升整体搜索效果。

下面这个请求是在 Easysearch 中创建一个名为 search_model_aliyun 的搜索管道(search pipeline)。搜索管道允许你在搜索请求的不同阶段插入自定义逻辑。

PUT /_search/pipeline/search_model_aliyun
{
  "request_processors": [
    {
      "semantic_query_enricher" : {
        "tag": "tag1",
        "description": "aliyun search embedding model",
        "url": "https://dashscope.aliyuncs.com/compatible-mode/v1/embeddings",
        "vendor": "openai",
        "api_key": "<api_key>",
        "default_model_id": "text-embedding-v4",
        "vector_field_model_id": {
           "text_vector": "text-embedding-v4"
        }
      }
    }
  ],
     "phase_results_processors": [
    {
      "hybrid-ranker-processor": {
        "combination": {
          "technique": "rrf",
          "rank_constant": 60
        }
      }
    }
  ],
    "response_processors": [
    {
        "hybrid_score_explanation": {}
    }
  ]
}

搜索管道结构: #

请求处理器 (request_processors) #

{
   "semantic_query_enricher": {}
}

这部分配置了一个语义查询增强器,将查询文本转换为向量表示,用于后续的向量搜索。

查询阶段结果处理器 (phase_results_processors) #

{
   "hybrid-ranker-processor": {}
}

这部分配置了一个混合排序处理器。

响应处理器 (response_processors),可选 #

{
   "hybrid_score_explanation": {}
}

这部分配置了一个混合分数解释器,它会:

  • 在搜索结果中添加解释信息
  • 帮助理解不同部分(如文本匹配和语义相似度)对最终得分的贡献

使用混合查询 API 进行搜索 #

将 search_model_aliyun 设置为默认搜索管道

PUT /my-index/_settings
{
  "index.search.default_pipeline" : "search_model_aliyun"
}

执行混合搜索 以下示例请求组合了两个查询子句: 语义查询和匹配查询。它使用上一步设置的默认搜索管道进行查询

GET /my-index/_search
{
  "_source": {
    "exclude": [
      "text_vector"
    ]
  },
  "query": {
    "hybrid": {
      "queries": [
        {
          "match": {
            "input_text": "夏季旅游首选"
          }
        },
        {
          "semantic": {
            "text_vector": {
              "query_text": "夏季旅游首选",
              "candidates": 10,
              "query_strategy": "LSH_COSINE"
            }
          }
        }
      ]
    }
  }
}