Elasticsearch 高版本支持 learning-to-rank 插件,它支持召回文档的相对复杂的模型排序,如 xgboost 模型,Ranklib 里支持的模型,同时也支持每个字段的相似分数提取,可将其作为后续精排的特征,该 ltr 插件是 es 高阶使用的一大亮点。
特征仓库
es ltr 里有特征仓库的概念,一个特征仓库其实就是一个 es 的索引,可以存储特征和模型的元数据。
初始化
一般初始化默认的特征仓库,如下:
PUT _ltr
删除默认的特征仓库,如下:
DELETE _ltr
至于删除特征仓库谨慎使用,它会清楚所有的特征集合、模型等数据。
特征及特征集合
一个特征集合是多个特征组成的集合,它是作用于特征打印(feature logging)和离线训练(offline training),具体是通过特征打印构造离线训练的样本,然后生成的模型是和特征集合是映射的关系。
创建特征集合
用 POST 请求构造特征集合,默认形式如下:
POST _ltr/_featureset/{featureset_name}
{
......
}
实际应用中,一般会根据业务自定义特征空间,它定义在 _ltr
和 _featureset
之间,具体如下:
POST _ltr/movie_search/_featureset/more_movie_features
{
"featureset": {
"features": [
{
"name": "title_query",
"params": [
"keywords"
],
"template_language": "mustache",
"template": {
"match": {
"title": "{{keywords}}"
}
}
},
{
"name": "title_query_boost",
"params": [
"some_multiplier"
],
"template_language": "derived_expressions",
"template": "title_query * some_multiplier"
},
{
"name": "custom_title_query_boost",
"params": [
"some_multiplier"
],
"template_language": "script_feature",
"template": {
"lang": "painless",
"source": "params.feature_vector.get('title_query') * (long)params.some_multiplier",
"params": {
"some_multiplier": "some_multiplier"
}
}
}
]
}
}
关于更多内容参见 Elasticsearch ltr 特征集合及特征设计详解。