ElasticSearch - Kombinace Dotazů pro 4 oddělené náhodně sourted skupin?

0

Otázka

Jsem poměrně nový na elasticsearch (i když s trochu kousavou SQL zkušenost) a jsem v současné době potýká s uvedením správného dotazu spolu. Mám 2 booleovské pole isPlayer a isEvil se, že položka je buď true nebo false na. Na základě toho se chci rozdělit mých údajů do 4 skupin:

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

Tyto skupiny chci, aby se náhodně třídění v sobě, pak se připojit je k být jeden dlouhý seznam, který můžu vložit. Rád bych k tomu, že uvnitř dotaz, jak to vypadá "správný" způsob, jak to udělat, protože já bych to udělal podobně jako v SQL. V seznamu skupin jsou řazeny v pořadí, takže nejprve všechny položky ve Skupině 1 v náhodném pořadí, pak všechny položky ve Skupině 2, v náhodném pořadí, pak všechny položky Skupiny 3 atd. . Je nutné, aby náhodnosti třídění je reprodukovatelný, pokud daný stejné vstupy, takže pokud třídění je založeno na random_score v ideálním případě bych být pomocí semen pro náhodnost.

Mohu postavit jeden dotaz, ale jak mám kombinovat 4?

Jako přístupy, které jsem zatím našel, MultiSearch a Disjunkce Max Dotazu. MultiSearch vypadá to, že to nepodporuje Stránkování. Pokud jde Disjunkce Max Dotazu by to mohlo být, že mi chybí les pro stromy, ale tam mám problém v tom, že poddotazy být řazeny náhodně pouze v rámci sebe před připojením je na jednu další.

Zde, jak jsem se napsat jeden dotaz pro teď bez Disjunction Max Queryv případě , že to pomáhá:

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

Nejlepší odpověď

0

Řešení tohoto problému není 4 oddělené skupiny, ale místo toho zajistit, že všichni mají různé rozsahy skóre a řazení podle skóre. Toho může být dosaženo tím, že bodování hity, ne nějaký odpovídající kritéria, ale prostřednictvím script-skóre pole. Toto pole umožňuje psát kód sami, která vrací logické skóre (výchozí jazyk je tzv. "bezbolestný", ale viděl jsem příklady groovy stejně).

Logika je poměrně jednoduchá:

  1. Pokud isPlayer = true, přidáme 2 body do skóre
  2. Pokud isEvil = true, přidat 4 body do skóre
  3. Buď jak buď, přidat náhodné číslo mezi 0 a 1, aby skóre na konci

To vytváří 4 skupiny chtěl jsem s odlišnými skóre-rozsahy:

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

Dotaz bude vypadat takto:

  "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

V jiných jazycích

Tato stránka je v jiných jazycích

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