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等。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM