我對 elasticsearch 相當陌生(盡管有相當多的 SQL 經驗)并且目前正在努力將正確的查詢放在一起。我有 2 個布爾欄位isPlayer,isEvil并且一個條目是true或false。基于此,我想將我的資料集分成 4 組:
- isPlayer: 真, isEvil: 真
- isPlayer: true, isEvil: false
- isPlayer: false, isEvil: true
- isPlayer: false, isEvil: false
我想對這些組進行隨機排序,然后將它們附加到一個我可以分頁的長串列中。我想在查詢中執行此操作,因為這似乎是執行此操作的“正確”方法,因為我會在 SQL 中執行類似操作。在該串列中,組將按順序排序,因此首先以隨機順序排列組 1 的所有條目,然后以隨機順序排列組 2 的所有條目,然后是組 3 的所有條目等。如果給定相同的輸入,排序的隨機性必須是可重現的,所以如果排序是基于random_score理想的,我會使用隨機性的種子。
我可以構建一個查詢,但如何組合 4 個?
到目前為止,我發現的方法是MultiSearch和Disjunction Max Query。MultiSearch 似乎不支持 Pagination。關于 Disjunction Max Query 可能是因為我缺少樹木的森林,但是我正在努力讓子查詢僅在它們自己內部隨機排序,然后再將它們相互附加。
在這里,我現在如何Disjunction Max Query在沒有的情況下撰寫單個查詢,以防萬一:
{
"query": {
"bool": {
"should": [
{
"term": {
"isPlayer": true
}
},
{
"term": {
"isEvil": true
}
}
]
}
}
}
uj5u.com熱心網友回復:
這個問題的解決方案不是做 4 個單獨的組,而是確保它們都有不同的分數范圍和按分數排序。這可以通過不是通過某種匹配標準而是通過腳本分數欄位對命中進行評分來實作。此欄位允許您自己撰寫回傳邏輯分數的代碼(默認語言稱為“無痛”,但我也看過 groovy 的示例)。
邏輯相當簡單:
- 如果isPlayer = true,則得分加2分
- 如果isEvil = true,則得分加4分
- 無論哪種方式,在最后的分數中添加一個 0 到 1 之間的亂數
這創建了我想要的具有不同分數范圍的 4 個組:
- isPlayer = true, isEvil = true --> 得分范圍:6-7
- isPlayer = false, isEvil = true --> 分數范圍:4-5
- isPlayer = true, isEvil = false --> 得分范圍:2-3
- isPlayer = false, isEvil = false --> 得分范圍:0-1
查詢將如下所示:
"query": {
"script_score": {
"query": {
"match_all": {}
},
"script": {
"source": """
double score = 0;
if(doc['isPlayer']){
score = 2;
}
if(doc['isEvil']){
score = 4;
}
int partialSeed = 1;
score = randomScore(partialSeed, 'id');
return score;
"""
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/365805.html
標籤:弹性搜索
