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": {}
}
}
后续步骤
- 了解更多关于搜索结果重排序的信息。
- 查看使用交叉编码器模型进行重排序的完整示例。
- 查看按文档字段重排序的完整示例。
- 请参阅使用外部托管的交叉编码器模型按字段重排的综合示例。