1:项目背景
app的频道页面需要针对内容做分发优化,让一些优质的内容得到更多的曝光。频道页涉及一定的定向性(同一个频道页只能出现该类目的内容),并且每一个频道页的体量不是很大。思前想后不建议通过推荐系统做内容过滤,再去做分发。
2:技术方案调研
之前对elasticsearch funciton_score 有一定的了解,但是不是很深入(阮一鸣大佬的es分享)。查找了相关文档可以通过function_score传入groovy脚本,动态打分。于是在集群上测试相关函数,并且与产品初步讨论相关纬度。通过script_score调整es的打分权重,答案是可行。
POST es_score_test/_search
{
"_source": ["category_id", "parent_nature_id", "uid", "gmt_create","second_nature_id"],
"from": 0,
"size": 100,
"query": {
"function_score": {
"query": {
"match": {
"parent_nature_id": "1"
}
},
"functions": [
{
"gauss": {
"gmt_create": {
"origin": "2019-03-01T14:10:30Z",
"scale": "6d",
"offset": "1d"
}
}
},
{
"field_value_factor": {
"field": "click_cout",
"modifier": "log1p",
"factor": 0.1
}
},
{
"script_score": {
"script": {
"params": {
"threshold": 5,
"discount": 0.8,
"target":102
},
"source": "double sortScore=0;double price =doc['second_nature_id'].value; double margin = 10; if (price < params.threshold) { sortScore = price * margin / params.target }else {sortScore = price * (1 - params.discount) * margin / params.target} return sortScore"
}
}
},
{
"script_score": {
"script": {
"params": {
"threshold": 5,
"discount": 0.8,
"target":10
},
"source": "double sortScore=0;double price =doc['second_nature_id'].value; double margin = 10000; if (price < params.threshold) { sortScore = price * margin / params.target }else {sortScore = price * (1 - params.discount) * margin / params.target} return sortScore"
}
}
}
],
"boost_mode": "sum"
}
}
}
3:我们应该通过那些纬度做(大概列举一些因素)
计算因子 | 权重 |