Rerank 处理器
2.12 版本引入
rerank 搜索响应处理器拦截并重新排序搜索结果。该处理器根据文档的新分数对搜索结果中的文档进行排序。
OpenSearch 支持以下重排序类型。
| 类型 | 描述 | 最早可用版本 |
|---|---|---|
ml_opensearch | 应用 OpenSearch 提供的交叉编码器模型。 | 2.12 |
by_field | 根据用户提供的字段应用重排序。 | 2.18 |
请求正文字段
下表列出了所有可用的请求字段。
| 字段 | 数据类型 | 必需/可选 | 描述 |
|---|---|---|---|
<rerank_type> | 对象 | 必需 | 文档重排序的重排序类型。有效值为 ml-opensearch 和 by_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_text 或 query_text_path 中的一个,但不能同时提供两者。
| 字段名 | 必需/可选 | 描述 |
|---|---|---|
query_text | query_text 或 query_text_path 中必须且仅能提供一个。 | 要用于重排序搜索结果的自然语言文本问题。 |
query_text_path | query_text 或 query_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": {}
}
}
后续步骤
- 了解更多关于搜索结果重排序的信息。
- 查看使用交叉编码器模型进行重排序的完整示例。
- 查看按文档字段重排序的完整示例。
- 请参阅使用外部托管的交叉编码器模型按字段重排的综合示例。