ES 使用权重排序

 

一.场景 

 

  现在有个文章列表查询需求,自己写的文章要排在最上面,然后在根据,是否精品文章,然后得分最高,最后在根据创建时间,降序排序.

 

二. 分析

       

  MYSQL中:  其他的条件都比较简单,通过字段排序就可以了,唯一有点麻烦的就是自己的要排在前面,这种我们通过case when 和 userId 一比较相等的为1不得的为0, 然后给个别名,通过这个别名排序也可以实现

  ES中:  其他字段也一样排序,通过字段排序就可以, 有问题的就是,自己写的文章要排在最前面,相当于我们需要通过传入用户id,来查询,因为用户id是动态的没有办法像mysql 一样写case when 来比较,不过 ES 中提供了给文档加权重的方式来排序

   

 

三.  初始化数据

 

  实体字段: 

 

  

 

 

 

ES:保存在es中的数据

 

 

 

 

四.  编码

 weightFactorFunction

  在 ES 搜索结果中_score 这个字段相信大家并不陌生,这是 ES 给出的评分,我们可以根据评分来排序,然后将原创类型的评分提高就可以实现想要的效果。

 

JAVA代码:

 

 

 

 

结果按照了给定字段排序:

 

 

 

 

 

 scriptFunction

除了使用 weightFactorFunction 来设置权重,另外介绍一种灵活度更高,适用于更复杂的排序场景的方式 scriptFunction。

scriptFunction 允许我们通过脚本的方式来实现权重,直接看代码:

 

 

查询结果满足条件:

 

 

 


scoreScript 就是控制权重的脚本,也就是一段代码(脚本默认是 groovy),是不是方便的多,支持的脚本语言有groovy,js,python等。

posted @ 2021-09-08 14:41  历尽千帆归来任是少年  阅读(2957)  评论(0编辑  收藏  举报