 Function Score Query 优化算分
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
