閱讀本文需要先了解 function_score 的相關知識,請看 ElasticSearch - function_score 簡介
在正常的查詢下,有相同評分的 score 的文檔會每次都會以相同次序出現,但是爲了提高展現率,在此引入一些隨機性可能會是個好主意,這能保證有相同評分的文檔都能有均等相似的展現機率
先準備數據和索引,在 ES 插入三筆數據,其中 language 是 keyword 類型,like 是 integer 類型(代表點贊量)
{ "language": "java", "like": 5 }
{ "language": "python", "like": 5 }
{ "language": "go", "like": 10 }
使用 random_score 生成隨機排序
注意在 functions 裡,只有 weight 加強函數加了 filter,也就是說只有 like 數小於等於 5 的文檔,才會被 weight 加強函數加強
而 random_score 加強函數沒有加 filter,表示所有的文檔都會被 random_score 隨機排序一遍
GET mytest/doc/_search
{
"query": {
"function_score": {
"query": {
"match_all": {}
},
"functions": [
{
"filter": {
"range": {
"like": {
"lte": 5
}
}
},
"weight": 2
},
{
"random_score": {
"seed": 100
}
}
]
}
}
}
當 random_score 的 seed 設為 100,其結果為
"hits": [
{
"_score": 1.2912227,
"_source": { "language": "python", "like": 5 }
},
{
"_score": 1.1301208,
"_source": { "language": "java", "like": 5 }
},
{
"_score": 0.9083528,
"_source": { "language": "go", "like": 10 }
}
]
當 random_score 的 seed 設為 200,其結果為
"hits": [
{
"_score": 1.2040303,
"_source": { "language": "java", "like": 5 }
},
{
"_score": 0.5595852,
"_source": { "language": "go", "like": 10 }
},
{
"_score": 0.10916698,
"_source": { "language": "python", "like": 5 }
}
]