学习排序 Learning To Rank
学习排序 (LTR) 使用经过训练的机器学习 (ML) 模型为您的搜索引擎构建排序函数。通常,该模型用作第二阶段重排序器,以提高由更简单的第一阶段检索算法返回的搜索结果的相关性。LTR 函数接受文档列表和搜索上下文,并输出排序的文档:
学习排序概述图
Figure 6. Learning To Rank overview

搜索上下文
除了要排序的文档列表之外,LTR 函数还需要一个搜索上下文。通常,此搜索上下文至少包括用户提供的搜索词(上例中的 text_query)。搜索上下文还可以提供排名模式中使用的其他信息。这可以是有关执行搜索的用户信息(例如人口统计数据、地理位置或年龄);有关查询的信息(例如查询长度);或查询上下文中的文档(例如标题字段的分数)。
判断列表
LTR 模型通常根据判断列表进行训练,判断列表是一组带有相关性等级的查询和文档。判断列表可以是人工生成的或机器生成的:它们通常从行为分析中填充,通常需要人工审核。判断列表确定给定搜索查询的理想结果排序。LTR 的目标是使模型尽可能接近地拟合新查询和文档的判断列表排名。
判断列表是用于训练模型的主要输入。它由一个数据集组成,其中包含查询和文档对以及它们对应的相关性标签。相关性判断通常是二元的(相关/不相关)或更精细的标签,例如 0(完全不相关)到 4(高度相关)之间的等级。以下示例使用分级相关性判断。
判断列表示例图
Figure 7. Judgment list example

判断列表的注意事项
虽然判断列表可以由人工手动创建,但也有一些技术可以利用用户参与数据(例如点击或转化)来自动构建判断列表。
判断列表的数量和质量将极大地影响 LTR 模型的整体性能。在构建判断列表时,应非常仔细地考虑以下方面:
- 大多数搜索引擎可以使用不同的查询类型进行搜索。例如,在电影搜索引擎中,用户按标题搜索,但也按演员或导演搜索。在判断列表中保持每种查询类型的示例数量平衡至关重要。这可以防止过度拟合,并允许模型有效地泛化所有查询类型。
- 用户通常提供比负面示例更多的正面示例。通过平衡正面和负面示例的数量,您可以帮助模型更准确地学习区分相关内容和不相关内容。
特征提取
仅查询和文档对不足以训练用于 LTR 的 ML 模型。判断列表中的相关性分数取决于许多属性或特征。必须提取这些特征才能确定各种组件如何组合以确定文档相关性。判断列表加上提取的特征构成了 LTR 模型的训练数据集。
这些特征分为三个主要类别:
- 文档特征:这些特征直接来自文档属性。例如:电子商务商店中的产品价格。
- 查询特征:这些特征直接从用户提交的查询中计算得出。例如:查询中的字数。
- 查询-文档特征:用于提供查询上下文中有关文档的信息的特征。例如:标题字段的 BM25 分数。
为了准备训练数据集,将特征添加到判断列表中:
带有特征的判断列表图
Figure 8. Judgment list with features

要在 Elasticsearch 中执行此操作,请在构建训练数据集时以及在查询时的推理过程中使用模板化查询来提取特征。以下是模板化查询的示例:
[
{
"query_extractor": {
"feature_name": "title_bm25",
"query": { "match": { "title": "{{query}}" } }
}
}
]
模型
LTR 的核心当然是 ML 模型。使用上述训练数据结合目标来训练模型。在 LTR 的情况下,目标是根据判断列表以最佳方式对结果文档进行排序,并给出一些排序指标,例如 nDCG 或 MAP。该模型仅依赖于训练数据中的特征和相关性标签。
LTR 领域正在快速发展,并且正在试验许多方法和模型类型。实际上,Elasticsearch 专门依赖于梯度提升决策树 (GBDT) 模型进行 LTR 推理。
请注意,Elasticsearch 支持模型推理,但训练过程本身必须在 Elasticsearch 之外使用 GBDT 模型进行。在当今使用的最流行的 LTR 模型中,LambdaMART 提供了强大的排序性能和低推理延迟。它依赖于 GBDT 模型,因此非常适合 Elasticsearch 中的 LTR。
XGBoost 是一个众所周知的库,它提供了 LambdaMART 的实现,使其成为 LTR 的热门选择。我们在 eland 中提供帮助程序,以方便将经过训练的 XBGRanker 模型集成为 Elasticsearch 中的 LTR 模型。
在“训练和部署 LTR 模型”中了解有关训练的更多信息,或查看 elasticsearch-labs 存储库中提供的交互式 LTR 笔记本。
Elastic Stack 中的 LTR
在本指南的下一页中,您将学习:
- 使用 eland 训练和部署 LTR 模型
- 使用 LTR 模型作为重新评分器进行搜索
使用 Learning to Rank 进行搜索
Learning to Rank 作为重打分器
一旦你的 LTR 模型在 Elasticsearch 中训练和部署完成,它就可以在搜索 API 中用作重打分器:
GET my-index/_search
{
"query": {
"multi_match": {
"fields": ["title", "content"],
"query": "the quick brown fox"
}
},
"rescore": {
"learning_to_rank": {
"model_id": "ltr-model",
"params": {
"query_text": "the quick brown fox"
}
},
"window_size": 100
}
}
- 首轮查询: 提供待重打分的文档。
model_id
: 上传到 Elasticsearch 的已训练模型的唯一标识符。
params
: 要传递给用于特征的查询模板的命名参数。
window_size
: 每个分片上重打分器应检查的文档数量。
已知限制
重打分窗口大小
LTR 模型返回的分数通常与首轮查询发出的分数不可比,并且可能低于未重打分的分数。这可能导致未重打分的文档排名高于重打分的文档。为了防止这种情况,window_size
参数对于 LTR 重打分器是必需的,并且应该大于或等于 from + size
。
分页
将分页公开给用户时,window_size
应该在传递不同的 from
值的过程中保持不变。更改 window_size
可能会改变排名靠前的结果,导致用户翻页时结果发生混乱的偏移。
负分
根据模型的训练方式,模型可能会为文档返回负分。虽然首阶段检索和排名不允许负分,但在 LTR 重打分器中可以使用它们。