ElasticSearch - Combinarea Interogărilor pentru 4 separate aleatoriu sourted grupuri?

0

Problema

Sunt destul de nou pentru elasticsearch (deși cu un pic echitabil de SQL experiență) și sunt în prezent luptă cu punerea corectă interogare împreună. Eu am 2 domenii boolean isPlayer și isEvil care o intrare este fie true sau false pe. Bazat pe asta, vreau să-mi împart setul de date în 4 grupe:

  1. isPlayer: adevărat, isEvil: adevărat
  2. isPlayer: adevărat, isEvil: fals
  3. isPlayer: false, isEvil: adevărat
  4. isPlayer: false, isEvil: fals

Aceste grupuri vreau să aleatoriu fel în ei înșiși, apoi atașați-le să fie o listă lungă care pot paginate. Aș vrea să fac asta în interogare, ca asta pare a fi "corect" mod de a face acest lucru, deoarece aș face-o în mod similar în SQL. În această listă, grupurile vor fi sortate în ordine, deci, în primul rând, toate intrările din Grupa 1 într-o ordine aleatorie, atunci toate intrările din Grupa 2 într-o ordine aleatorie, atunci toate intrările de Grup 3 etc. . Este necesar ca intamplarea de sortare este reproductibilă în cazul dat aceleași date de intrare, așa că, dacă sortarea se bazează pe random_score în mod ideal, aș fi folosind o sămânță pentru dezordine.

Pot construi o singură interogare, dar cum pot combina 4?

Ca se apropie am găsit până acum MultiSearch și Disjuncții Max Interogare. MultiSearch pare ca acesta nu are suport pentru Paginare. Cu privire la Despărțire Max Interogare ar putea fi faptul că eu sunt pădurea de copaci, dar nu mă zbat într-având subinterogari fi sortate aleatoriu numai în ei înșiși înainte de a adăugându-le una de alta.

Aici cum se scrie o singură interogare pentru moment, fără Disjunction Max Query, în cazul în care vă ajută:

{
  "query": {
    "bool": {
      "should": [
        {
          "term": {
            "isPlayer": true
          }
        },
        {
          "term": {
            "isEvil": true
          }
        }
      ]
    }
  }
}
elasticsearch
2021-11-22 13:35:49
1

Cel mai bun răspuns

0

Soluția la această problemă nu este de a face 4 grupuri separate, dar în loc să asigure toate au diferite intervale de scoruri și sortarea de scoruri. Acest lucru poate fi realizat, de notare hit-uri, nu de un fel de criterii de potrivire, dar printr-un script-scor domeniu. Acest câmp vă permite să scrie cod de tine, care returnează o logica scor (limba implicită este numit "nedureroase", dar am vazut exemple de groovy la fel de bine).

Logica este destul de simpla:

  1. Dacă isPlayer = true, se adaugă 2 puncte la scor
  2. Dacă isEvil = true, se adauga 4 puncte la scor
  3. Oricum, se adaugă un număr aleator între 0 și 1 la scor de la sfârșitul

Acest lucru creează cele 4 grupuri am vrut distincte, înscrie-game:

  1. isPlayer = true, isEvil = true --> Scor-gama: 6-7
  2. isPlayer = false, isEvil = true --> Scor-gama: 4-5
  3. isPlayer = true, isEvil = false --> Scor-gama: 2-3
  4. isPlayer = false, isEvil = false --> Scor-gama: 0-1

Interogarea ar arata astfel:

  "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;
        """
      }
    }
  }
}
2021-11-24 08:51:50

În alte limbi

Această pagină este în alte limbi

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................