一.場景
現在有個文章列表查詢需求,自己寫的文章要排在最上面,然后在根據,是否精品文章,然后得分最高,最后在根據創建時間,降序排序.
二. 分析
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等。
