版权声明:发扬开源精神,欢迎大家转载对自己有用的文章(●'◡'●) https://blog.csdn.net/jacksonary/article/details/84036030
Rescoring
再评分机制通过将query
和post_filter
关键词返回来的前一部分文档数据(比如前100-500个文档)进行重新排序可以提高精确度,这个过程中使用的是次要算法(通常次要算法耗费的资源会更多),所以只是将它用于前部分文档的再排序行为中,而不是应用于索引中所有的文档排序中。
再评分rescore
请求会在每个碎片返回由处理整个搜索请求的节点排序后的结果返回之前执行,目前rescore
只有一个接口实现——查询再评分机制,使用查询来调整评分,将来的版本中可能会有其他的再评分机制,比如成对的再评分。
查询再评分机制
查询再评分仅仅会在前一部分返回的数据中执行,每个碎片上检查的文档数可以使用window_size
设置,默认为10。默认情况下,原始查询的评分和再评分查询是线性混合后就是每个文档的最终_score
,原始查询和rescore
查询的相对重要性可以使用query_weight
和rescore_query_weight
参数进行指定,两个参数默认都为1。下面是一个小栗子:
curl -X POST "localhost:9200/_search" -H 'Content-Type: application/json' -d'
{
"query" : {
"match" : {
"message" : {
"operator" : "or",
"query" : "the quick brown"
}
}
},
"rescore" : {
// 指定每个碎片上检查的文档数量
"window_size" : 50,
"query" : {
"rescore_query" : {
"match_phrase" : {
"message" : {
"query" : "the quick brown",
"slop" : 2
}
}
},
// 原始查询的比重
"query_weight" : 0.7,
// 再评分的比重
"rescore_query_weight" : 1.2
}
}
}
'
评分组合的机制可以使用score_mode
参数控制,有如下的参数可选:
total
:添加原始的分数和查询再评分的分数,这也是默认模式;multiply
:原始分数乘以查询再评分的分数,对于查询资源的函数很管用;avg
:取原始得分和再评分查询分数得平均数;max
:取原始得分和再评分得分中较大的那个分数;min
:取原始得分和再评分得分中较小的那个分数;
多次再评分
上述是单一的再评分,也可以按序执行多个再评分的操作,如:
curl -X POST "localhost:9200/_search" -H 'Content-Type: application/json' -d'
{
"query" : {
"match" : {
"message" : {
"operator" : "or",
"query" : "the quick brown"
}
}
},
"rescore" : [ {
"window_size" : 100,
"query" : {
"rescore_query" : {
"match_phrase" : {
"message" : {
"query" : "the quick brown",
"slop" : 2
}
}
},
"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.likes.value + 2)"
}
}
}
}
}
} ]
}
'
第一步是先获取查询的结果,第二步再获取第一步的结果,以此类推…第二步中的再评分将会看到第一步中再评分排序执行完毕,因此可以将会在第一次的再评分(rescore
)过程中为了第二次的再评分(rescore
)使用一个大的window
去把文档拉取到一个较小的window
中。