主页 >> 程序猿的东西 >> elasticsearch自定义评分与排序

elasticsearch自定义评分与排序

自定义评分

先看一个例子

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

发表评论

滚动至顶部