自定义评分
先看一个例子
{
"query": {
"function_score":{
"query":{
"match": {
"_all":"地板"
}
},
"functions": [
{
"filter": {
"range": { "editor_recommend_time": {"gt":0} }
},
"weight": 2
},
{
"filter": {
"range": { "recommend_time": {"gt":0} }
},
"weight": 1
},
{
"random_score":{
"seed": 10
}
}
],
"score_mode":"sum",
"boost_mode":"multiply"
}
}
}
这段代码基于query查询,又利用functions设置了额外的评分规则,这里包含了两个filter和一个random_score,filter产生的评分结果是0或1,weight相当于系数,如果weight=2那么在filter条件为真的情况下会返回2,random_score会产生一个0~1的浮点数(貌似是double类型)。
下面指定了两个mode,score_mode表示了functions里面各个块的计算规则,这里是sum,也就是将functions中的各个运算值相加。另一个boost_mode是指定function_score中各个块的计算规则,在这个例子中是将query的评分与functions的结果相乘。es支持的mode可以是以下值:
multiply:将结果乘以_score
sum:将结果加上_score
min:取结果与_score的较小值
max:取结果与_score的较大值
replace:使结果替换掉_score
通过自定义评分我们可以设置出我们想要的排序结果,因为es的默认排序就是评分降序。
自定义排序
如果不想改变评分而设置排序,还可以单纯自定义排序。
GET /index/_search
{
"_source": [
"match_id"
],
"size": 20,
"from": 0,
"filter": {
"match": {
"_all": "地板"
}
},
"sort": {
"_script": {
"type": "number",
"script": "Math.random()*(doc['editor_recommend_time'].value+doc['recommend_time'])+doc['editor_recommend_time'].value",
"order": "desc"
}
}
}
这里使用了脚本来算得一个排序值,因为我们并不需要用到评分排序,所以查询条件使用了filter,会免去一些评分的计算。
福利
腾讯云Elasticsearch 30天免费试用,前往查看>>