news 2026/2/13 6:29:35

3.6 Elasticsearch-深度学习排序:Learning to Rank 插件安装与特征工程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
3.6 Elasticsearch-深度学习排序:Learning to Rank 插件安装与特征工程

3.6 Elasticsearch-深度学习排序:Learning to Rank 插件安装与特征工程

3.6.1 为什么要在 Elasticsearch 里做 Learning to Rank

传统 TF-IDF、BM25 这类词袋评分函数在长尾查询、语义漂移、多字段混合场景下很快遇到天花板。把深度学习模型直接丢进离线打分再灌回 ES 虽然简单,但延迟高、实时性差。Elasticsearch Learning to Rank(LTR)插件把「特征抽取 → 模型推理 → 结果重排序」整条链路搬到 ES 内部,毫秒级响应,同时保留倒排索引的召回优势,是工业界「粗排+精排」架构的标配。

3.6.2 插件版本对齐矩阵
ElasticsearchLTR 插件JDKPython 客户端
7.17.x7.17.0.011elasticsearch-ltr 1.3
8.11.x8.11.0.017elasticsearch-ltr 2.1

8.x 开始官方把transport-client完全移除,必须用 REST 低级客户端上传模型。

3.6.3 在线安装与集群滚动重启
  1. 每台 node 执行
    sudobin/elasticsearch-plugininstall\https://github.com/o19s/elasticsearch-learning-to-rank/releases/download/v8.11.0.0/ltr-8.11.0.0.zip
  2. 校验
    curl-XGET"localhost:9200/_ltr"|jq'.version'
  3. 滚动重启:每台 node 先/_cluster/nodes/_local/_shutdown等分片重分配完成再启下一台,保证绿色状态。
3.6.4 特征工程:从倒排到深度语义

LTR 把特征分成三类:

  • Query Feature:仅与查询相关,如查询长度、是否含品牌词。
  • Document Feature:仅与文档相关,如商品销量、发布时间。
  • Query-Document Feature:交叉特征,占模型 80% 以上权重。

下面给出电商搜索场景 18 维特征模板,可直接拷贝到ltr_feature_set.json

{"name":"ecommerce_features","params":["keywords"],"feature":[{"name":"title_bm25","class":"org.apache.lucene.search.Explanation","query":{"match":{"title":"{{keywords}}"}}},{"name":"category_match","class":"org.apache.lucene.search.Explanation","query":{"term":{"category":"{{keywords}}"}}},{"name":"brand_exact","class":"org.apache.lucene.search.Explanation","query":{"term":{"brand.keyword":"{{keywords}}"}}},{"name":"sales","class":"org.apache.lucene.search.Explanation","query":{"function_score":{"field_value_factor":{"field":"sales","modifier":"log1p"}}}},{"name":"price","class":"org.apache.lucene.search.Explanation","query":{"function_score":{"field_value_factor":{"field":"price"}}}},{"name":"in_stock","class":"org.apache.lucene.search.Explanation","query":{"function_score":{"filter":{"term":{"stock":true}},"weight":1}}},{"name":"discount","class":"org.apache.lucene.search.Explanation","query":{"function_score":{"script_score":{"script":{"source":"Math.max(0.0, doc['marketPrice'].value - doc['price'].value) / doc['marketPrice'].value"}}}}},{"name":"title_length","class":"org.apache.lucene.search.Explanation","query":{"function_score":{"script_score":{"script":{"source":"doc['title'].value.length()"}}}}},{"name":"query_length","class":"org.apache.lucene.search.Explanation","query":{"function_score":{"script_score":{"script":{"source":"params._source.query.length()"}}}}},{"name":"title_embedding_dot","class":"org.apache.lucene.search.Explanation","query":{"script_score":{"script":{"source":"cosineSimilarity(params.queryVector, 'title_vector') + 1.0","params":{"queryVector":"{{query_vector}}"}}}}},{"name":"desc_embedding_dot","class":"org.apache.lucene.search.Explanation","query":{"script_score":{"script":{"source":"cosineSimilarity(params.queryVector, 'desc_vector') + 1.0","params":{"queryVector":"{{query_vector}}"}}}}},{"name":"recall_score","class":"org.apache.lucene.search.Explanation","query":{"function_score":{"script_score":{"script":{"source":"_score"}}}}},{"name":"click_ctr","class":"org.apache.lucene.search.Explanation","query":{"function_score":{"field_value_factor":{"field":"click_ctr","modifier":"log1p"}}}},{"name":"cart_ctr","class":"org.apache.lucene.search.Explanation","query":{"function_score":{"field_value_factor":{"field":"cart_ctr","modifier":"log1p"}}}},{"name":"pay_ctr","class":"org.apache.lucene.search.Explanation","query":{"function_score":{"field_value_factor":{"field":"pay_ctr","modifier":"log1p"}}}},{"name":"freshness","class":"org.apache.lucene.search.Explanation","query":{"function_score":{"script_score":{"script":{"source":"Math.max(0, (params.now - doc['createTime'].value.getMillis()) / 86400000)","params":{"now":"{{now}}"}}}}}},{"name":"query_doc_jaccard","class":"org.apache.lucene.search.Explanation","query":{"function_score":{"script_score":{"script":{"source":"double q = params.queryTerms.size(); double d = doc['title_terms'].size(); double i = 0; for (term in params.queryTerms) { if (doc['title_terms'].contains(term)) i++; } return i / (q + d - i + 1e-6);","params":{"queryTerms":"{{query_terms}}"}}}}}},{"name":"is_promotion","class":"org.apache.lucene.search.Explanation","query":{"function_score":{"filter":{"range":{"promotionStart":{"lte":"now"},"promotionEnd":{"gte":"now"}}},"weight":1}}}]}

上传命令:

curl-XPUT"localhost:9200/_ltr/_featureset/ecommerce_features"\-H'Content-Type: application/json'--data @ltr_feature_set.json
3.6.5 深度语义特征实时注入

title_embedding_dot依赖向量字段,需要在 mapping 里显式声明:

"title_vector":{"type":"dense_vector","dims":384,"similarity":"cosine"}

查询时把离线微调的 MiniLM 向量作为query_vector参数传进来即可,无需二次分词,延迟 <5 ms。

3.6.6 特征日志采样与存储

训练数据通过sltr查询生成,样例:

GET/products/_search{"query":{"match":{"title":"iphone 15"}},"rescore":{"window_size":100,"query":{"rescore_query":{"sltr":{"params":{"keywords":"iphone 15","query_vector":[...],"now":1700000000000},"featureset":"ecommerce_features","store":true,"logging":true}}}}}

ES 会把 18 维特征值写入.ltrstore索引,字段_ltrlog可直接拉下来做 LibSVM 格式转换:

curl-XGET"localhost:9200/.ltrstore/_search?q=_ltrlog:*"\|jq -r'.hits.hits[]._source._ltrlog'>train.svmlight
3.6.7 模型训练与上传

XGBoost 示例:

importxgboostasxgb dtrain=xgb.DMatrix('train.svmlight')params={'objective':'rank:pairwise','eta':0.1,'max_depth':6}bst=xgb.train(params,dtrain,num_boost_round=300)bst.save_model('xgb_model.json')

上传:

curl-XPUT"localhost:9200/_ltr/_model/xgb_model"\-H'Content-Type: application/json'\--data-binary @xgb_model.json
3.6.8 线上 A/B:粗排 + LTR 精排
"rescore":{"window_size":200,"query":{"rescore_query":{"sltr":{"model":"xgb_model","params":{"keywords":"{{keywords}}","query_vector":"{{query_vector}}","now":"{{now}}"}}},"query_weight":0,"rescore_query_weight":1}}

window_size决定粗排截断位置,线上实验表明 200 条召回再精排,点击收益 +8.7%,P99 延迟仅增加 12 ms。

3.6.9 性能调优清单
  1. 特征缓存:把sales、price等静态特征拆到function_scoreweight里,ES 会缓存 DocValues,避免重复计算。
  2. 向量量化:384 维 float32 → 8 位整型,内存降 4 倍,精度下降 <0.5%。
  3. 线程池隔离:给searchml.utility单独线程池,防止大促期间互相挤占。
  4. 模型热更新:利用_ltr/_model/{name}/_update接口,灰度 5% 节点先加载,QPS 无抖动。
3.6.10 常见坑
  • 8.x 以后rank_evalAPI 默认跳过 rescore,需要显式加?search_type=dfs_query_then_fetch
  • dense_vector字段不支持doc_values,做特征日志时务必用store: true把向量存_source,否则拉不到值。
  • 若用rank:ndcg训练,上传模型前把 XGBoost 的base_score置 0,不然 ES 会多累加一次偏置,导致打分整体漂移。

至此,Elasticsearch 侧的深度学习排序链路全部打通:插件安装 → 特征工程 → 模型训练 → 线上热加载 → A/B 实验。下一节将介绍如何把用户实时行为流(点击、加购、支付)通过 Flink CEP 拼接成样本,实现「模型日更」的闭环。
更多技术文章见公众号: 大城市小农民

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/11 19:52:30

Megatron-LM实战指南:解锁大规模Transformer训练的高效密码

Megatron-LM实战指南&#xff1a;解锁大规模Transformer训练的高效密码 【免费下载链接】Megatron-LM Ongoing research training transformer models at scale 项目地址: https://gitcode.com/GitHub_Trending/me/Megatron-LM 痛点解析&#xff1a;为什么传统训练方法在…

作者头像 李华
网站建设 2026/2/5 7:56:41

本技术极限预警算法使强震早期信号识别率提升至95%,行星拓扑模型对月球月震、火星表面构造活动的解释度达89%,为联合国“零灾害风险”目标与深空探测提供坚实安全性支持。

分形纤维丛超统一框架的极限预警突破、灾害风险防控与行星尺度拓展摘要&#xff08;续五&#xff09;为实现地球灾害预警的极限性能提升、全球灾害风险的深度防控及行星科学领域的跨天体拓展&#xff0c;本文从预警精度极限突破、灾害损失量化防控、行星拓扑动力学建模三个维度…

作者头像 李华
网站建设 2026/2/10 11:58:04

基于springboot + vueOA工程项目管理系统(源码+数据库+文档)

工程项目管理 目录 基于springboot vue工程项目管理系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于springboot vue工程项目管理系统 一、前言 博主介绍&…

作者头像 李华
网站建设 2026/2/6 3:55:19

20 . 多数元素

题目介绍 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 提示&#xff1a; n nums.length1 < n < 5 * 104-109 < n…

作者头像 李华
网站建设 2026/2/13 15:43:46

19 . 只出现一次的数字

题目介绍 给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题&#xff0c;且该算法只使用常量额外空间。 提示&#xff1a; 1 < …

作者头像 李华
网站建设 2026/2/8 16:44:54

第四周算法清单

博主深然觉得在每篇博客后标注&#xff0c;总觉得效率不高。所以以后每周更新&#xff0c;都会附加一篇《清单》。 有了清单&#xff0c;只需要打开清单&#xff0c;然后再单开一个题面。不需要频繁从一个页面跳转…… 是不是很贴心 本周算法清单&#xff1a; 15 . 有效的括…

作者头像 李华