一.场景
现在有个文章列表查询需求,自己写的文章要排在最上面,然后在根据,是否精品文章,然后得分最高,最后在根据创建时间,降序排序.
二. 分析
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等。