Elasticsearch Learning to Rank 高级功能详解

Elasticsearch Learning to Rank 高级功能详解

【免费下载链接】elasticsearch-learning-to-rank Plugin to integrate Learning to Rank (aka machine learning for better relevance) with Elasticsearch 【免费下载链接】elasticsearch-learning-to-rank 项目地址: https://gitcode.com/gh_mirrors/el/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插件的高级功能,包括特征重用、派生特征、多特征存储管理、缓存优化和实验性功能等。这些高级功能可以帮助开发者构建更复杂、更高效的搜索排序系统。在实际应用中,建议根据具体场景和性能需求选择合适的特性组合。

【免费下载链接】elasticsearch-learning-to-rank Plugin to integrate Learning to Rank (aka machine learning for better relevance) with Elasticsearch 【免费下载链接】elasticsearch-learning-to-rank 项目地址: https://gitcode.com/gh_mirrors/el/elasticsearch-learning-to-rank

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值