上一篇講到了文檔在搜尋時是如何計算得分,在進行ES全文搜索時,搜索的結果會預設“_score”(文檔得分)字段的降序,當我們想用其他字段進行升序或降序可以使用sort來幫我們達成。
當簡單的sort沒有辦法滿足我們的需求時,就輪到function_score登場了,function_score可以自定義調整文檔的得分(相關度)
搜尋文檔的條件,就是前幾篇教的ES query,不指定的話預設
{
"query": {
"match_all": {}
}
}
列表,調整得分的使用的方式跟規則
{
"functions": [
調整條件1,
調整條件2,
...
]
}
決定old score和加強score如何合併,合併方式有以下幾種:
1.multiply(預設): new score = old score * 加強score
2.sum: new score = old score + 加強score
3.min: new score = min(old score, 加強score)
4.max: new score = max(old score, 加強score)
5.replace: new score = 加強score
決定functions裡面的加強score們怎麼合併,會先把functions裡的加強score合併成一個總加強score在跟old score合併
1.multiply(預設)
2.sum: 加總
3.first: 使用首個函數的結果作為最終結果
4.max: 取最大值
5.min: 去最小值
6.avg: 取平均值
限制加強score的最大值
加強score = min(加強score, max_boost)
new score = old score * weight
指定一個字段乘上原score
new score = old score * 指定字段的數值
對每個用戶都使用一個不同的隨機評分對結果排序,但對某一用戶來說,看到的隨機順序始終是一致的
以某個字段設定一個值為基準,文檔字段的值距離基準越近得分越高
・linear:線性函數是條直線,一旦直線與橫軸 0 相交,所有其他值的評分都是 0
・exp:指數函數是先劇烈衰減然後變緩
・guass:高斯函數則是鐘形的,他的衰減速率是先緩慢,然後變快,最後又放緩
圖片來源:https://kucw.github.io/blog/2018/7/elasticsearch-function_score-gauss/
自定義腳本控制評分,但通常效率取決於使用者,所以如果可以話建議使用ES所提供的控制評分方法
今天就先到這邊,下一篇就來實際操作上面的function_score吧!