es修改排序_elasticsearch自定义评分与排序

本文介绍了如何在Elasticsearch中进行自定义评分和排序。通过示例展示了如何使用function_score查询结合filter和random_score来设定额外的评分规则,并解释了不同score_mode和boost_mode的作用。同时,还提供了不改变评分而仅自定义排序的方法,利用_script进行排序计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自定义评分

先看一个例子

{

"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天免费试用,前往查看>>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值