在查询的过程调整评分的计算方式
es 默认的计算评分的方式不一定满足我们的要求。
比如我现在有一个博客系统,用户可以给喜欢的博客来投票,同时我希望做到用户在搜索的时候,优先把得票数高的博客返回。但是投票数是一个数字,默认的评分策略是考虑相关性,但是数字没法考虑相关性。
function_score query
如果要将这个数字考虑进评分,可以通过 function_score query 来实现
具体的思路就是:在旧的得分基础上,将票数考虑进去,重新得出一个新的评分。
具体的计算方式有如下几种:
field_value_factor
script_score
random_score
weight
数据准备:
查询下,分数如下:
script_score
自己写脚本来定义评分
至于为什么 最终得分还要再乘一个 oldSocre ,这与下面的 boost_mode
参数有关
可以通过 设置 boost_mode
参数来让脚本的最终结果当成我们的评分结果
如下:
boost_mode
参数的可选项如下:
- multiply:分数相乘,同时这也是默认值。所以一开始没设置参数的时候,最终得分还要与 oldScore 相乘
- sum:分数相加
- avg:求平均数
- max:最大分
- min:最小分
- replace:不进行二次计算
field_value_factor
类似于上面的 script_score
但是不用自己写脚本
实现如下:
这样下来,默认的得分方式为 oldScore*votes
用 es 内置的函数进行一些更加复杂的运算
假设我们的分数计算方式还是用 旧的分数* votes。
如下:
用 modifier 可以设置内置函数,如 log 取对数等。
factor 参数
影响影子,加入了这个参数后,字段的值首先要乘以影响因子,然后再进行计算。
以 sqrt 为例子:
计算公式如下:sqrt(factor*votes)
max_boost 参数
控制 functions 计算的结果的上限,如果超过了,就按上限计算。
weight 和 random_score
weight 是简单在旧的评分基础上 乘以 weight 做新的评分。
random_score 会根据 uid 进行hash 运算,用的较少,毕竟没人会用随机数当分数吧
boosting query
根据某些条件降低得分
boosting query 中包含 3 部分:
- positive:得分不变
- negative:降低得分
- negative_boost:降低的权重