学习排序 (LTR)
Elastic Stack Serverless
此功能在 8.12.0 版本中引入,仅适用于某些订阅级别。有关更多信息,请参阅 https://elastic.ac.cn/subscriptions。
学习排序 (LTR) 使用经过训练的机器学习 (ML) 模型来为您的搜索引擎构建排序函数。通常,该模型用作第二阶段重排序器,以提高更简单的第一阶段检索算法返回的搜索结果的相关性。LTR 函数接受文档列表和搜索上下文,并输出排序后的文档

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

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

要在 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 中提供了帮助程序,以促进将训练的 XGBRanker 模型作为 Elasticsearch 中的 LTR 模型进行集成。
了解有关 训练和部署 LTR 模型的更多信息,或者查看我们在 elasticsearch-labs
存储库中提供的 交互式 LTR 笔记本。
在本指南的下一页中,您将学习如何