Function Score Query 优化算分
# 一、概念
Function Score Query可以在查询结束后,对每一个匹配的文档进行一系列的重新算分,根据新生成的分数进行排序。
默认有如下几种的计算分值的函数:
- Weigth:为每一个文档设置一个简单而不被规范化的权重
- Field Value Factor:使用该数值来修改_score,例如将“热度”和“点赞数”作为算分的参考因素
- Random Score:为每一个用户使用一个不同的,随机算分结果
- 衰减函数:以某个字段的值作为标准,距离某个值很近,得分越高
- Script Score:自定义脚本完全控制所需逻辑
# 二、案例
数据准备
DELETE blogs
PUT /blogs/_doc/1
{
"title": "About popularity",
"content": "In this post we will talk about...",
"votes": 0
}
PUT /blogs/_doc/2
{
"title": "About popularity",
"content": "In this post we will talk about...",
"votes": 100
}
PUT /blogs/_doc/3
{
"title": "About popularity",
"content": "In this post we will talk about...",
"votes": 1000000
}
votes字段优先查询
POST /blogs/_search
{
"query": {
"function_score": {
"query": {
"multi_match": {
"query": "popularity",
"fields": [ "title", "content" ]
}
},
"field_value_factor": {
"field": "votes"
}
}
}
}
这样的方式最后算分是通过常规算分 * votes的数值,就会存在如果votes字段数值过大过小,会导致整个算分差距过大,尤其votes为0的时候。
log函数平滑算分
POST /blogs/_search
{
"query": {
"function_score": {
"query": {
"multi_match": {
"query": "popularity",
"fields": [ "title", "content" ]
}
},
"field_value_factor": {
"field": "votes",
"modifier": "log1p"
}
}
}
}
POST /blogs/_search
{
"query": {
"function_score": {
"query": {
"multi_match": {
"query": "popularity",
"fields": [ "title", "content" ]
}
},
"field_value_factor": {
"field": "votes",
"modifier": "log1p" ,
"factor": 0.1 // 平滑因子
}
}
}
}
通过log函数的时候,使得我们的算分不会过大或者过小。
最终分为相加所得
之前我们的最终分是常规算分 * 指定字段的数值,我们可以指定最终算分为加法,或者其他表达式。
POST /blogs/_search
{
"query": {
"function_score": {
"query": {
"multi_match": {
"query": "popularity",
"fields": [ "title", "content" ]
}
},
"field_value_factor": {
"field": "votes",
"modifier": "log1p" ,
"factor": 0.1
},
"boost_mode": "sum",
"max_boost": 3
}
}
}
随机函数
在一些网站的广告等业务场景,让每个用户能看到不同的随机排名,但是希望对一个用户而言,看到的排名相对固定。
POST /blogs/_search
{
"query": {
"function_score": {
"random_score": {
"seed": 911119
}
}
}
}
# 参考
上次更新: 2024/06/29, 15:13:44