自定义评分
先看一个例子
{ "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文档>>>
通过自定义评分我们可以设置出我们想要的排序结果,因为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,会免去一些评分的计算。
更多详情参考es文档>>>
福利
腾讯云Elasticsearch 30天免费试用,前往查看>>