如何对搜索结果进行二次打分
2020-04-11 本文已影响0人
郭彦超
这么做一般有两个目的
1、对返回的商品做精细化排序,尤其是在通过es实现相似推荐时会被经常用到
2、固定商品结果数检索,当商品太多时,为了确保服务性能打分算法无法在全量商品进行计算,这时可取头部商品后按照新的规则进行重排序
假如用户通过搜索框检索“快闪邀请函”,我们通过rescore对召回的商品进行二次重排,将描述中包含“企业”,且商品收藏量相对比较大的商品进行提权显示:
GET search_data/_search
{
"query" : {
"match" : {
"title": {
"operator" : "and",
"query" : "快闪邀请函"
}
}
},
"rescore" : [ {
"window_size" : 100,
"query" : {
"rescore_query" : {
"match" : {
"desc" : {
"query" : "企业"
}
}
},
"query_weight" : 0.7,
"rescore_query_weight" : 1.2
}
}, {
"window_size" : 10,
"query" : {
"score_mode": "multiply",
"rescore_query" : {
"function_score" : {
"script_score": {
"script": {
"source": "Math.log10(doc.user_collect.value + 2)"
}
}
}
}
}
} ]
}
需要注意:
1、不要在原始查询中使用sort进行排序,否则无法进行rescore查询
2、如果对搜索结果进行分页查询的话,不要试图改变window_size的值,如果改变会在进行翻页是引起数据显示的混乱
-
window_size
每个分片中进行二次重排的商品数量 -
query_weight
原始查询语句打分权重 -
rescore_query_weight
recore查询语句权重 -
score_mode
默认原始查询score+二次评分score得到最终的文档score;还支持:multiply、avg、max、min