1 为什么要在 Elasticsearch 上做 LTR?

适用版本: Elasticsearch ≥ 8.12.0
前置条件: 需拥有包含 “Serverless LTR” 的订阅等级(详见官方订阅矩阵)
技术栈: Elasticsearch + Python + Eland + XGBoost / LightGBM / scikit-learn

  • 相关性瓶颈:经典 BM25 只能“打基础”,很难兼顾业务特征(点击率、销量、评分……)。
  • 端到端成本:把向量检索或深度模型接到 ES 之外,需要额外的服务网关、时延和 DevOps。
  • Elasticsearch 8.12.0 新特性:官方 Serverless LTR 能直接在 search → rescore 阶段调用训练好的模型,既继承 ES 的伸缩性,又省去了微服务运维。

2 整体流程概览

在这里插入图片描述

3 环境准备

pip install "elasticsearch>=8.12" eland pandas scikit-learn xgboost lightgbm
export ELASTICSEARCH_URL="http://localhost:9200"
export ELASTIC_PASSWORD="elastic_password"

贴士:离线训练最好用一套隔离的 ES 集群,避免大规模特征抽取冲击线上查询。

4 定义特征抽取模板(QueryFeatureExtractor)

from eland.ml.ltr import QueryFeatureExtractor, LTRModelConfigfeature_extractors = [# 1️⃣  BM25 分数QueryFeatureExtractor(feature_name="title_bm25",query={"match": {"title": "{{query}}"}}),# 2️⃣  Title 命中词数QueryFeatureExtractor(feature_name="title_matched_term_count",query={"script_score": {"query": {"match": {"title": "{{query}}"}},"script": {"source": "return _termStats.matchedTermsCount();"}}}),# 3️⃣  直接把文档字段当特征QueryFeatureExtractor(feature_name="popularity",query={"script_score": {"query": {"exists": {"field": "popularity"}},"script": {"source": "return doc['popularity'].value;"}}}),# 4️⃣  查询词长度QueryFeatureExtractor(feature_name="query_term_count",query={"script_score": {"query": {"match": {"title": "{{query}}"}},"script": {"source": "return _termStats.uniqueTermsCount();"}}}),
]ltr_config = LTRModelConfig(feature_extractors)

为什么不用自己写脚本?
Eland 与 Elasticsearch 同步开发&测试,可确保训练阶段与线上推理的特征完全一致,避免“训练-服务漂移”。

5 采集训练数据(FeatureLogger)

from eland.ml.ltr import FeatureLogger
from elasticsearch import Elasticsearch
import pandas as pdes = Elasticsearch(ELASTICSEARCH_URL, basic_auth=("elastic", ELASTIC_PASSWORD))
MOVIE_INDEX = "movies_demo"logger = FeatureLogger(es, MOVIE_INDEX, ltr_config)# 假设我们已有一份人工评判文件 judgements.csv
judgements = pd.read_csv("judgements.csv")  # query, doc_id, relevancerecords = []
for _, row in judgements.iterrows():feats = logger.extract_features(query_params={"query": row.query},doc_ids=[row.doc_id])record = feats[0].to_dict()record["label"] = row.relevancerecords.append(record)df_train = pd.DataFrame(records)
df_train.to_csv("ltr_train.csv", index=False)

性能提示:FeatureLogger 会自动合并批量请求、最小化查询次数,但大量特征 × 大量样本仍可能对 ES 造成压力。调低 size 或切分批次能进一步减负。

6 训练 Ranker

以下以 XGBRanker 为例(LightGBM、RandomForest、DecisionTree 均可):

from xgboost import XGBRanker
import numpy as npX = df_train[feature_extractors_names].values
y = df_train["label"].values
group = df_train.groupby("query").size().to_numpy()  # 每个 query 的样本数ranker = XGBRanker(objective="rank:pairwise",n_estimators=300,max_depth=6,learning_rate=0.1)
ranker.fit(X, y, group=group)

7 模型部署一键化(MLModel.import_ltr_model)

from eland.ml import MLModelMODEL_ID = "movies_ltr_xgboost_v1"MLModel.import_ltr_model(es_client=es,model=ranker,model_id=MODEL_ID,ltr_model_config=ltr_config,es_if_exists="replace"       # 本例重复执行时覆盖
)

执行后,Eland 会自动:

  1. 将模型序列化为 ES 接受的 [Eland ML Pack] 格式;
  2. 调用 Create Trained Model API 上传;
  3. 生成 inference_config,包含上文 4 个特征查询模板。

8 线上调用:Search + Rescore

POST movies_demo/_search
{"query": {"match": {"title": "science fiction"}},"rescore": {"window_size": 100,"query": {"rescore_query": {"ltr_model": {"model_id": "movies_ltr_xgboost_v1","params": { "query": "science fiction" }}},"query_weight": 0.2,"rescore_query_weight": 1.0}}
}
  • window_size 控制重新排序的命中窗口,100-500 较常见;
  • params.query 必须与特征模板中的 {{query}} 对应;
  • query_weight 越小,模型重排权重越大。

9 模型管理运维

操作API说明
查看模型GET _ml/trained_models/<id>包含元数据、大小、创建时间
移除旧版DELETE _ml/trained_models/<id>勿忘同时清理索引模板里旧 rescore 配置
批量迁移POST _ml/trained_models/_revert结合 CI/CD 做蓝绿发布
性能监控_nodes/stats inference关注推理延迟 & CPU/内存

10 最佳实践与踩坑

场景建议
特征库膨胀控制在 20-40 个以内;复杂逻辑交给模型学习权重,而不是写 N 个脚本评分
交叉验证使用 group k-fold,确保同一 query 不同时出现在 train&test
线上流量回滚给旧 BM25 排序保留 20% 流量,异常时快速切换
版本化movies_ltr_xgboost_v1v2,避免热更新导致 cache 冲突
安全与订阅开启 HTTPS + token;无服务器版本仅在满足订阅级别时可用

11 总结

借助 8.12.0 新增的 Serverless LTR + Eland:

  • 开发侧:用 Python 就能完成 特征抽取 → 训练 → 部署 闭环,无需自研特征解析与序列化。
  • 运维侧:模型与索引共生,统一在 ES 集群里监控、热更新,简化了线上链路。
  • 业务侧:短期内即可验证“学习排序 vs 传统 BM25”的收益,并可逐步升级至更复杂的多阶段检索 / 向量召回方案。

开源笔记本示例:https://github.com/elastic/elasticsearch-labs/tree/main/notebooks/ltr

赶紧试试把你的点击日志、评分字段喂给 XGBoost,让搜索结果 “更懂业务” 吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/94652.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/94652.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/94652.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV入门:图像处理基础教程

OpenCV简介 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习库。它包含超过2500种优化算法&#xff0c;涵盖图像处理、物体识别、人脸检测、3D重建、视频分析等任务。 核心功能 图像处理&#xff1a;滤波、边缘检测、几…

影响内容传播速度的因素有哪些?

内容的传播速度是我们在衡量营销效果时的重要指标。传播速度越快&#xff0c;越能帮助品牌迅速覆盖目标受众&#xff0c;在短时间内提升影响力。影响内容传播速度的方式来自多个方面&#xff0c;下面就让我们一同来了解下这其中的因素。一、观点价值观点是否具有价值&#xff0…

css动态样式

使用scss通过变量设置css动态样式<template><div><!-- 方式一 --><p v-for"(item, index) in dataList" :key"index" :style"{--color: item.color}" >{{item.name}}</p><!-- 方式二 --><p v-for"(…

开源流媒体服务器ZLMediaKit 的Java Api实现的Java版ZLMediaKit流媒体服务器-二开视频对话

安全性&#xff1a;使用了WSS&#xff08;WebSocket Secure&#xff09;协议确保通信安全 兼容性&#xff1a;支持现代浏览器的WebRTC功能 信令机制&#xff1a;通过WebSocket进行信令交换&#xff0c;确保连接建立 媒体传输&#xff1a;使用STUN服务器进行NAT穿透&#xff0c;…

mariadb10.3.35备份脚本

一、创建备份用户[(none)]> create user buserlocalhost identified by tmrQ;[(none)]> GRANT RELOAD, PROCESS, LOCK TABLES, REPLICATION CLIENT ON *.* TO buserlocalhost;[(none)]> flush privileges;二、脚本# cat mysql_bask.sh #!/bin/bash # MariaDB 10.3.35…

W3D引擎游戏开发----从入门到精通【22】

配置完成基本DT物体项后&#xff0c;在这个DT物体项中开始添加这个玩家的动画信息&#xff0c;如下所示。UseAnim设置是否使用动画功能&#xff0c;这里开启。AnimTypeN设置总共的动画类型数&#xff0c;当前只有一个待机动画&#xff0c;因此设置为1。AnimType1FrameN设置1号动…

在我国申请注册的商标在国外可以用不!

近日一个网友找到普推知产商标老杨&#xff0c;问在我国申请注册商标在新加坡和欧盟可以用不&#xff0c;当然用不成&#xff0c;根据商标法的地域性原则&#xff0c;商标权保护限于注册地&#xff0c;驰名商标享有部分跨国保护&#xff0c;但是这个要有所在国相关法律证据。如…

在开发板上画出一个2048棋盘的矩阵

#include “head.h"int* p lcd NULL; //显示屏内存映射的起始地址int g lcd width; //LCD显示屏的宽度int g lcd high ; //LCD显示屏的高度int g lcd bpp; //每个像素点所占的比特位//int x:屏的X轴&#xff08;宽度、列&#xff09;坐标//int y:屏幕y轴&#xff08;高度、…

开源软件与文化:从嬉皮士精神到数字时代的协同创新

开源软件与文化&#xff1a;从嬉皮士精神到数字时代的协同创新 本文章由笔者使用提示词驱动AI创作&#xff0c;并进行审阅。 文章目录开源软件与文化&#xff1a;从嬉皮士精神到数字时代的协同创新一、引言&#xff1a;开源的文化基因与技术革命二、开源软件的文化根源&#x…

sigfillset 函数详解

sigfillset 函数详解 一、函数概念 sigfillset() 是 POSIX 信号处理中的核心函数&#xff0c;用于初始化并填充一个信号集&#xff0c;使其包含当前系统支持的所有信号。它是操作信号屏蔽字&#xff08;signal mask&#xff09;的基础工具&#xff0c;常与 sigprocmask()、sigs…

Redis实战(8) -- 分布式锁Redission底层机制

介绍Redisson 是基于 Redis 实现的 Java 驻内存数据网格&#xff08;In-Memory Data Grid&#xff09;&#xff0c;提供了分布式和可扩展的 Java 数据结构&#xff0c;如分布式锁、分布式集合等。【注意】如果需要重新实现redission&#xff0c;需要重新设置RedissionClient配置…

Linux基础测试

linux基础测试 一、环境准备 基础环境信息 登录用户&#xff1a;root&#xff08;初始密码&#xff1a;redhat&#xff09; 虚拟机启动&#xff1a;登录后执行 virt-manager&#xff0c;右键启动 node1 和 node2 虚拟机 node1 信息&#xff1a;root 密码为 redhat&#xf…

Linux中Docker Swarm实践

一、部署前后分离使用你自己的自定义镜像部署多个副本所有副本使用相同的配置和逻辑Nginx 做反向代理统一入口外部访问形式如&#xff1a;http://your-domain/api/xxx1.1 建立私库镜像已构建并推送到可访问的镜像仓库启动 Docker Registry 容器docker run -d -p 5000:5000 --re…

Dash 中的 dcc.Clipboard 组件详解:实现一键复制功能

dcc.Clipboard 是 Dash 核心组件库中的一个实用工具&#xff0c;允许用户将指定内容一键复制到系统剪贴板&#xff0c;极大提升用户体验。本文将深入解析该组件的用法、特性和实际应用场景。 一、组件核心功能与价值 dcc.Clipboard 解决了 Web 应用中的关键痛点&#xff1a; 简…

初识C++类的6个默认成员函数

目录 一、初始化和清理 二、拷贝复制 三、取地址重载 四、重要说明 五、注意事项 六、示例代码 在C中&#xff0c;当一个类没有显式定义某些成员函数时&#xff0c;编译器会自动生成6个默认成员函数。这些函数可以分为以下几类&#xff1a; 一、初始化和清理 1、构造函数…

Spring事务失效场景?

题目详细答案Spring事务失效的场景主要有以下几种。非public方法使用Transactional场景描述&#xff1a;Spring事务管理是基于AOP实现的&#xff0c;而AOP对于JDK动态代理或CGLib动态代理只会代理public方法。如果事务方法的访问修饰符为非public&#xff0c;SpringAOP无法正确…

1.电动汽车动力电池系统技术介绍与分类

1.电动汽车动力电池系统技术介绍与分类 1.1 电动汽车发展的三个 “黄金时代” 第一个黄金时代&#xff08;19 世纪末 - 20 世纪初&#xff09; 技术基础&#xff1a;铅酸蓄电池发明&#xff08;1859 年&#xff09;&#xff0c;推动电动三轮车&#xff08;1873 年&#xff09;、…

调用阿里云-阿里云百炼 AI

相关文档&#xff1a;大模型服务平台百炼控制台 多轮对话&#xff1a;通义千问模型的多轮对话_大模型服务平台百炼(Model Studio)-阿里云帮助中心 创建知识库&#xff1a;大模型服务平台百炼控制台 创建智能体&#xff1a;大模型服务平台百炼控制台 点击智能体发布后&#x…

Apache Flink:从实时数据分析到实时AI

引言欢迎踏上这段深入了解 Apache Flink 演进历程的旅程&#xff0c;Apache Flink 是一项重新定义了实时数据处理的技术。本博客文章基于王峰&#xff08;阿里云开放数据平台负责人、Apache Flink Committer&#xff09;在 2025 年 Flink Forward Asia 新加坡大会上的演讲内容编…

oelove奥壹新版v11.7旗舰版婚恋系统微信原生小程序源码上架容易遇到的几个坑,避免遗漏参数白屏显示等问题

oelove和 金媒我都用过一段时间&#xff0c;其中oelove 用的时间较多&#xff0c;也比较了解这个系统&#xff0c;这个系统比较不错的就是小程序是原生的&#xff08;完全遵循微信开发者平台规则非Uniapp&#xff09;开发的&#xff0c;原生小程序的特点就是兼容性好&#xff0…