ElasticSearch, Unendo la Query per 4 separati in modo casuale sourted gruppi?

0

Domanda

Io sono abbastanza nuovo di elasticsearch (anche se con un bel po ' di SQL esperienza) e sono attualmente alle prese con la messa una corretta query. Ho 2 campi booleani isPlayer e isEvil che una voce è true o false su. Sulla base di che, voglio dividere il mio dataset in 4 gruppi:

  1. isPlayer: true, isEvil: true
  2. isPlayer: true, isEvil: false
  3. isPlayer: false, isEvil: true
  4. isPlayer: false, isEvil: false

Questi gruppi voglio casualmente sorta all'interno di se stessi, quindi collegarli a essere un lungo elenco, che posso impaginare. Vorrei che all'interno della query, come sembra che sia il modo "giusto" per farlo, visto che mi piacerebbe farlo allo stesso modo in SQL. In tale elenco, i gruppi devono essere ordinati in ordine, quindi, prima di tutte le voci del Gruppo 1 in ordine casuale, quindi tutte le voci del Gruppo 2, in ordine casuale, quindi tutte le voci del Gruppo 3, etc. . È necessario che la casualità dell'ordinamento è riproducibile se dato gli stessi input, quindi, se l'ordinamento è basato su random_score idealmente mi piacerebbe essere utilizzando un seme per la casualità.

Posso costruire una singola query, ma come faccio a combinare 4?

Come approcci che ho trovato finora MultiSearch e Disgiunzione Max Query. MultiSearch sembra che non supporta la Paginazione. Per quanto riguarda Disgiunzione Max Query potrebbe essere che mi manca la foresta per gli alberi, ma non ci sto lottando per avere la sottoquery essere ordinati in modo casuale e solo all'interno di se stessi prima di accodare l'uno all'altro.

Qui io scrivo una singola query, per ora senza Disjunction Max Queryin caso aiuta a:

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

Migliore risposta

0

La soluzione a questo problema non è fare 4 gruppi separati, ma invece di garantire tutti hanno diverse gamme di punteggi e l'ordinamento in base a punteggi. Questo può essere realizzato, mettendo a segno i colpi non da un qualche tipo di criteri di corrispondenza, ma attraverso uno script punteggio di campo. Questo campo consente di scrivere codice che restituisce una logica di punteggio (per La lingua di default è chiamato "indolore", ma ho visto esempi di groovy così).

La logica è abbastanza semplice:

  1. Se isPlayer = true, 2 punti per il punteggio
  2. Se isEvil = true, aggiungere 4 punti per il punteggio
  3. In ogni modo, aggiungere un numero casuale tra 0 e 1 per il punteggio alla fine

Questo crea i 4 gruppi che ho voluto con distinte punteggio-intervalli:

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

La query sarebbe simile a questa:

  "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

In altre lingue

Questa pagina è in altre lingue

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