1、function_score
参考:
function_score 查询 是用来控制评分过程的终极武器,它允许为每个与主查询匹配的文档应用一个函数,以达到改变甚至完全替换原始查询评分 _score 的目的。
*** 单个加强函数的查询模板
GET 127.0.0.1/mytest/doc/_search
{
"query": {
"function_score": {
"query": {.....}, //主查询,查询完后这裡自己会有一个评分,就是old_score
"field_value_factor": {...}, //在old_score的基础上,给他加强其他字段的评分,这裡会产生一个加强score
,如果只有一个加强function时,直接将加强函数名写在query下面就可以了
"boost_mode": "multiply", //指定用哪种方式结合old_score和加强score成为new_score
"max_boost": 1.5 //限制加强score的最高分,但是不会限制old_score
}
}
}
***functions 多个加强函数的查询模板; “functions”: [], //主查询下来的多个筛选,多个评分函数(用functions包含这些函数)
GET 127.0.0.1/mytest/doc/_search
{
"query": {
"function_score": {
"query": {.....},
"functions": [ //可以有多个加强函数(或是filter+加强函数),每一个加强函数会产生一个加强score,因
此functions会有多个加强score
{ "field_value_factor": ... },
{ "gauss": ... },
{ "filter": {...}, "weight": ... }
],
"score_mode": "sum", //决定加强score们怎麽合併,
"boost_mode": "multiply" //決定總加強score怎麼和old_score合併
}
}
}
***例子
{
"query": {
"function_score": {
"query": {
"bool": {
"must": [{
"match": {
"channel.keyword": "动漫"
}
},
{
"term": {
"status": "1"
}
},
{
"term": {
"type": "1"
}
}
],
"filter":
[
{"range": {"score": {"gte": 9.6}}}
]
}
},
"functions": [{
"field_value_factor": {
"field": "heat",
"modifier": "log1p"
}
},
{
"filter": {
"term": {
"tags": "动作"
}
},
"weight": 5
},
{
"gauss": {
"score": {
"origin": "9",
"scale": 1
}
},
"weight": 1
}
],
"score_mode": "sum",
"boost_mode": "multiply"
}
}
}
score_mode
score_mode 设置为了 max,意思是取两个打分函数的最大值作为 func_score,对应上述假设也就是 2.3 和 42 两者中的最大值,即 func_score = 42
boost_mode 设置为了 multiply,就是把原来的 query_score 与 func_score 相乘就得到了最终的 score 分数。
参数 score_mode 指定多个打分函数如何组合计算出新的分数:
multiply : 分数相乘(默认)
sum : 相加
avg : 加权平均值
first : 使用第一个 filter 函数的分数
max : 取最大值
min : 取最小值
为了避免新的分数的数值过高,可以通过 max_boost 参数去设置上限。
boost_mode:
最终的分数 result_score 是由 query_score 与 func_score 进行计算而来,计算方式由参数 boost_mode 定义:
multiply : 相乘(默认),result_score = query_score * function_score
replace : 替换,result_score = function_score
sum : 相加,result_score = query_score + function_score
avg : 取两者的平均值,result_score = Avg(query_score, function_score)
max : 取两者之中的最大值,result_score = Max(query_score, function_score)
min : 取两者之中的最小值,result_score = Min(query_score, function_score)
function_score
function_score 提供了以下几种打分的函数:
weight : 加权。
random_score : 随机打分。
field_value_factor : 使用字段的数值参与计算分数。
decay_function : 衰减函数 gauss, linear, exp 等。
script_score : 自定义脚本。
**例子中的 weight 是 5 ,即自定义函数得分 func_score = 5 ,最终结果的 score 等于 query_score * 5 。
{
"query": {
"function_score": {
"query": { "match": { "message": "elasticsearch" } },
"weight": 5
}
}
}
2、aggs
参考:https://zhuanlan.zhihu.com/p/37500880
用post获取aggs结果
es的aggs可以分为度量聚合和桶聚合
度量聚合:min、max、sum、avg聚合, 度量聚合接收一个输入文档集并生成至少一个统计值
{
"aggs" : {
"avg_grade" : { "avg" : { "field" : "grade" } }
}}
桶聚合:term、range聚合,返回很多子集,并限定输入数据到一个特殊的叫做桶的子集中。可以把桶聚合想象成类似前面切面功能的东西
"aggs": {
"sum_logtype": {
"terms": {
"field": "log_type"
} } }}
3、贝叶斯平均得分计算
- WR, 加权得分(weighted rating)。
- R,该电影的用户投票的平均得分(Rating)。
- v,该电影的投票人数(votes)。
- m,排名前250名的电影的最低投票数(现在为3000)。
- C, 所有电影的平均得分(现在为6.9)。
仔细研究这个公式,你会发现,IMDB为每部电影增加了3000张选票,并且这些选票的评分都为6.9。这样做的原因是,假设所有电影都至少有3000张选票,那么就都具备了进入前250名的评选条件;然后假设这3000张选票的评分是所有电影的平均得分(即假设这部电影具有平均水准);最后,用现有的观众投票进行修正,长期来看,v/(v+m)这部分的权重将越来越大,得分将慢慢接近真实情况。
这样做拉近了不同电影之间投票人数的差异,使得投票人数较少的电影也有可能排名前列