Elasticsearch Learning to Rank 高级功能详解
前言
Elasticsearch Learning to Rank(简称LTR)是一个强大的机器学习排序插件,它允许开发者将机器学习模型集成到Elasticsearch的搜索流程中。在前面的基础教程中,我们已经介绍了LTR的基本使用方法。本文将深入探讨LTR的高级功能,帮助开发者更好地利用这一强大工具。
可重用特性
在实际项目中,我们经常会遇到需要在多个特征集中重复使用相同特征的情况。LTR提供了特征重用机制,可以避免重复定义相同的特征。
创建可重用特征
我们可以通过API创建独立的特征,这些特征可以被多个特征集引用。例如,创建一个标题搜索特征:
POST _ltr/_feature/titleSearch
{
"feature": {
"params": ["keywords"],
"template": {
"match": {
"title": "{{keywords}}"
}
}
}
}
特征管理操作
LTR提供了完整的CRUD操作来管理特征:
- 删除特征:
DELETE _ltr/_feature/titleSearch - 获取单个特征:
GET _ltr/_feature/titleSearch - 批量获取特征(支持前缀过滤):
GET /_ltr/_feature?prefix=t
在特征集中引用特征
创建或更新特征集时,可以直接引用已定义的特征:
POST /_ltr/_featureset/my_featureset/_addfeatures/titleSearch
这会将titleSearch特征添加到my_feature_set特征集中的下一个序号位置。
派生特征
派生特征是基于其他特征计算得到的特征,使用Lucene表达式语言实现。
基本概念
派生特征通过"template_language": "derived_expression"标识,可以接受数值类型的查询时变量。
脚本特征
脚本特征是派生特征的一种扩展形式,可以使用Elasticsearch的原生脚本或Painless脚本:
{
"name": "custom_title_query_boost",
"params": ["some_multiplier", "ltr_param_foo"],
"template_language": "script_feature",
"template": {
"lang": "painless",
"source": "(long)params.default_param * params.feature_vector.get('title_query') * (long)params.some_multiplier * (long) params.param_foo",
"params": {
"default_param": 10.0,
"some_multiplier": "some_multiplier",
"extra_script_params": {"ltr_param_foo": "param_foo"}
}
}
}
性能警告:脚本特征可能导致Elasticsearch集群性能下降,在性能敏感场景中应谨慎使用。
多特征存储
在大型系统中,我们可能需要为不同的应用或场景维护独立的LTR系统。
创建特征存储
PUT _ltr/wikipedia
在特定存储中操作
所有API操作都可以指定特征存储:
POST _ltr/wikipedia/_featureset/attempt_1
{
"featureset": {
"features": [
{
"name": "title_query",
"params": ["keywords"],
"template_language": "mustache",
"template": {
"match": {
"title": "{{keywords}}"
}
}
}
]
}
}
查询时指定存储
"sltr": {
"_name": "logged_featureset",
"featureset": "attempt_1",
"store": "wikipedia",
"params": {
"keywords": "star"
}
}
模型缓存管理
LTR插件使用内部缓存来存储编译后的模型,以提高性能。
缓存操作
- 清除缓存:
POST /_ltr/_clearcache - 获取缓存统计:
GET /_ltr/_cachestats
缓存配置
可以通过节点设置控制缓存行为:
ltr.caches.max_mem: 12mb # 最大内存使用量(默认10MB或最大堆的1/10)
ltr.caches.expire_after_write: 10m # 写入后过期时间(默认1小时)
ltr.caches.expire_after_read: 10m # 读取后过期时间(默认1小时)
特征分数缓存
默认情况下,LTR会分别计算模型推理和特征日志记录的特征分数。启用特征分数缓存可以避免重复计算:
"sltr": {
"cache": true,
"params": {
"keywords": "rambo"
},
"model": "my_model"
}
统计信息
LTR提供了详细的统计信息API:
GET /_ltr/_stats
响应包含集群状态、存储统计和节点级别的缓存信息。
实验性功能:TermStat查询
TermStatQuery是一个实验性功能,提供了更灵活的术语统计访问方式。
基本用法
{
"query": {
"term_stat": {
"expr": "df",
"aggr": "max",
"terms": ["rambo", "rocky"],
"fields": ["title"]
}
}
}
可用统计类型
df:文档频率idf:逆文档频率tf:词频tp:词位置ttf:总词频
脚本注入
TermStatQuery支持将术语统计信息注入到脚本上下文中,实现高级特征工程:
{
"name": "injection",
"template_language": "script_feature",
"template": {
"lang": "painless",
"source": "params.termStats['df'].size()",
"params": {
"term_stat": {
"analyzer": "!standard",
"terms": ["rambo rocky"],
"fields": ["overview"]
}
}
}
}
总结
本文详细介绍了Elasticsearch Learning to Rank插件的高级功能,包括特征重用、派生特征、多特征存储管理、缓存优化和实验性功能等。这些高级功能可以帮助开发者构建更复杂、更高效的搜索排序系统。在实际应用中,建议根据具体场景和性能需求选择合适的特性组合。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



