> 技术文档 > 在 Elasticsearch 中落地 Learning to Rank(LTR)

在 Elasticsearch 中落地 Learning to Rank(LTR)


1 为什么要引入 LTR?

常规检索(BM25、语义检索、Hybrid、RRF …)往往只能基于少量信号(关键词命中、向量相似度)排序。
Learning-to-Rank 通过机器学习模型多维度特征(文档属性、查询属性、查询-文档相关特征)融合为一个“最终得分”,在 Top-K 结果里做二阶段重排,可显著提升业务相关性。

经典场景:

场景 LTR 作用 电商搜索 同时考虑 BM25、销量、库存、价格区间、点击率等特征,综合排序 内容推荐 / 新闻 结合阅读时长、作者权重、文本相似度、用户画像特征做重排 RAG 检索 首阶段召回数百段文本,再用 LTR 精排 20 段注入 LLM,显著降低幻觉

1.1 Judgment List(标注集)

  • 内容

  • 来源:人工标注 / 点击转化日志(加权采样)

  • 平衡性

    • 各查询类型(标题、演员、品牌…)样本数要均衡
    • 正负样本比例适当(例如 1:4),防止模型倾向“认为全是相关”

1.2 特征工程

类型 示例 作用 Document 特征 价格、评分、发布时间 反映文档本身属性 Query 特征 词数、是否包含数字 反映查询意图 Query–Doc 特征 match 分数、向量相似度 关联度核心指标

在 ES 中用 templated query 把一段 DSL 转成特征抽取器,既用于离线生成训练集,也用于线上推理。

[ { \"query_extractor\": { \"feature_name\": \"title_bm25\", \"query\": { \"match\": { \"title\": \"{{query}}\" } } } }, { \"query_extractor\": { \"feature_name\": \"price_norm\", \"query\": { \"script_score\": { \"script\": \"doc[\'price\'].value / 1000\" } } } }]

2 训练 LTR 模型(LambdaMART)

  1. 生成训练 TSV/CSV

    relevance qid:123 1:title_bm25 2:price_norm 3:clicks ...
  2. XGBoost/LGBM 训练

    • Objective 设为 rank:pairwiserank:ndcg
    • 评估指标:nDCG@10、MAP 等
  3. 导出模型 (model.json)

📦 eland 工具一键上传:
eland_import_hub_model --url $ES --model_id my_ltr --task text_similarity --model_path model.json

3 在 Elasticsearch 中部署 reranker

POST _inference/_deployments{ \"inference_id\": \"my-ltr-reranker\", \"task_type\": \"text_similarity\", \"model_id\" : \"my_ltr\"}

4 检索 + LTR 二阶段重排示例

POST /products/_search{ \"size\": 10, // 最终返回 10 条 \"retriever\": { // Stage-1 召回 \"rrf\": { \"retrievers\": [ { \"standard\": { \"query\": { \"match\": { \"title\": \"wireless headset\" } }, \"k\": 100 } }, { \"standard\": { \"query\": { \"semantic\": { \"field\": \"semantic_text\", \"query\": \"wireless headset\" } }, \"k\": 100 } } ] } }, \"reranker\": { // Stage-2 LTR \"text_similarity_reranker\": { \"model_id\": \"my-ltr-reranker\", \"field\": \"{{{features}}}\", // 模板内包含多特征拼接 \"max_passages\": 10 } }}
  • retriever:先用 Hybrid + RRF 召回 100 条文档
  • text_similarity_reranker:调用 cross-encoder LambdaMART 模型重新排序

返回字段 _rank 即为 LTR 排名,_score 为 LTR 预测分。

5 常见问题与优化

症状 排查 & 建议 模型上传失败 确保 task_type 设置为 text_similarity;XGBoost 转 eland 时指定正确输入维度 线上 QPS 降低 rerank 仅对 Top-K 做,K 建议 ≤ 100;可横向扩容 inference 节点 未见提升 检查 judgment list 质量、正负样本比例;确认特征覆盖业务逻辑点 特征与线上不一致 保证离线特征模板与线上 query_extractor 完全相同;可在模板中打印 debug 字段

6 小结

  1. Judgment list → Feature → GBDT 训练
  2. eland 上传模型 → Inference Endpoint
  3. Retriever 首召回 + LTR rerank 单请求搞定

借助 Elasticsearch 9.x 内置的 text_similarity_reranker,你无需改动索引结构,即可把成熟的 LambdaMART/XGBoost 排序模型接入查询链路,在百毫秒级实时重排 Top-K 结果,轻松获得更贴近用户意图的搜索体验 🚀