Link Search Menu Expand Document Documentation Menu

Rerank 处理器

2.12 版本引入

rerank 搜索响应处理器拦截并重新排序搜索结果。该处理器根据文档的新分数对搜索结果中的文档进行排序。

OpenSearch 支持以下重排序类型。

类型 描述 最早可用版本
ml_opensearch 应用 OpenSearch 提供的交叉编码器模型。 2.12
by_field 根据用户提供的字段应用重排序。 2.18

请求正文字段

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

字段 数据类型 必需/可选 描述
<rerank_type> 对象 必需 文档重排序的重排序类型。有效值为 ml-opensearchby_field
context 对象 对于 ml_opensearch 重排序类型是必需的。对于 by_field 重排序类型是可选的,并且不影响结果。 rerank 处理器提供查询时进行重排序所需的信息。
tag 字符串 可选 处理器的标识符。
description 字符串 可选 处理器的描述。
ignore_failure 布尔型 可选 如果为 true,OpenSearch 将忽略此处理器的任何失败,并继续运行搜索管道中的其余处理器。默认为 false

ml_opensearch 重排序类型

2.12 版本引入

要使用交叉编码器模型重排序结果,请指定 ml_opensearch 重排序类型。

先决条件

在使用 ml_opensearch 重排序类型之前,必须配置一个交叉编码器模型。有关使用 OpenSearch 提供的模型的信息,请参阅交叉编码器模型。有关使用自定义模型的信息,请参阅自定义本地模型

ml_opensearch 重排序类型支持以下字段。所有字段都是必需的。

字段 数据类型 描述
ml_opensearch.model_id 字符串 用于重排序的交叉编码器模型的模型 ID。更多信息请参见使用机器学习模型
context.document_fields 数组 一个文档字段数组,指定从哪些字段检索交叉编码器模型的上下文。

示例

以下示例演示了使用包含 rerank 处理器(使用 ml_opensearch 重排序类型实现)的搜索管道。有关完整示例,请参阅使用交叉编码器模型进行重排序

创建搜索管道

以下请求创建了一个带有 rerank 响应处理器的搜索管道

PUT /_search/pipeline/rerank_pipeline
{
  "response_processors": [
    {
      "rerank": {
        "ml_opensearch": {
          "model_id": "gnDIbI0BfUsSoeNT_jAw"
        },
        "context": {
          "document_fields": [ "title", "text_representation"]
        }
      }
    }
  ]
}

使用搜索管道

将 OpenSearch 查询与包含大型语言模型 (LLM) 查询上下文的 ext 对象结合使用。提供将用于重排序结果的 query_text

POST /_search?search_pipeline=rerank_pipeline
{
  "query": {
    "match": {
      "text_representation": "Where is Albuquerque?"
    }
  },
  "ext": {
    "rerank": {
      "query_context": {
        "query_text": "Where is Albuquerque?"
      }
    }
  }
}

您可以提供包含用于重排序的文本的字段的完整路径,而不是指定 query_text。例如,如果在 text_representation 对象中指定子字段 query,则在 query_text_path 参数中指定其路径。

POST /_search?search_pipeline=rerank_pipeline
{
  "query": {
    "match": {
      "text_representation": {
        "query": "Where is Albuquerque?"
      }
    }
  },
  "ext": {
    "rerank": {
      "query_context": {
        "query_text_path": "query.match.text_representation.query"
      }
    }
  }
}

query_context 对象包含以下字段。您必须提供 query_textquery_text_path 中的一个,但不能同时提供两者。

字段名 必需/可选 描述
query_text query_textquery_text_path 中必须且仅能提供一个。 要用于重排序搜索结果的自然语言文本问题。
query_text_path query_textquery_text_path 中必须且仅能提供一个。 用于重排序搜索结果的问题文本的完整 JSON 路径。路径中允许的最大字符数为 1000

by_field 重排序类型

2.18 版引入

要按文档字段重排序结果,请指定 by_field 重排序类型。

by_field 对象支持以下字段。

字段 数据类型 必需/可选 描述
target_field 字符串 必需 指定包含用于重排序分数的字段名称或字段的点路径。
remove_target_field 布尔型 可选 如果为 true,响应不包含用于执行重排序的 target_field。默认为 false
keep_previous_score 布尔型 可选 如果为 true,响应包含一个 previous_score 字段,其中包含重排序前计算的分数,这在调试时很有用。默认为 false

示例

以下示例演示了使用包含 rerank 处理器(使用 by_field 重排序类型实现)的搜索管道。有关完整示例,请参阅按文档字段重排序

创建搜索管道

以下请求创建了一个带有 by_field 重排序类型响应处理器的搜索管道,该管道按 reviews.stars 字段对文档进行排名,并指定返回原始文档分数。

PUT /_search/pipeline/rerank_byfield_pipeline
{
  "response_processors": [
    {
      "rerank": {
        "by_field": {
          "target_field": "reviews.stars",
          "keep_previous_score" : true
        }
      }
    }
  ]
}

使用搜索管道

要将搜索管道应用于查询,请在查询参数中提供搜索管道名称。

POST /book-index/_search?search_pipeline=rerank_byfield_pipeline
{
  "query": {
     "match_all": {}
  }
}

后续步骤