ElasticSearch - la Combinaison de Requêtes pour 4 séparés au hasard sourted groupes?

0

La question

Je suis assez nouveau dans elasticsearch (mais avec un peu juste de SQL expérience) et je suis actuellement aux prises avec de mettre une bonne requête. J'ai 2 champs booléens isPlayer et isEvil qu'une entrée est soit true ou false sur. Sur cette base, je veux partager mon dataset en 4 groupes:

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

Ces groupes, je veux au hasard de tri à l'intérieur d'eux-mêmes, puis de les associer à une longue liste que je peux de la pagination. J'aimerais le faire à l'intérieur de la requête, comme cela semble être la "bonne" façon de faire cela, car je ferais de même en SQL. Dans cette liste, les groupes doivent être triés dans l'ordre, donc, la première de toutes les entrées de Groupe 1 dans un ordre aléatoire, puis toutes les entrées du Groupe 2 dans un ordre aléatoire, puis toutes les entrées de Groupe 3 etc. . Il est nécessaire que le caractère aléatoire de la tri est reproductible si on a les mêmes entrées, de sorte que, si le tri est basé sur random_score idéalement, je serais en utilisant une graine pour le hasard.

Je peux construire une seule requête, mais comment puis-je combiner les 4?

En effet, les approches que j'ai trouvé jusqu'à présent MultiSearch et la Disjonction Max Requête. MultiSearch semble qu'il ne prend pas en charge la Pagination. Concernant la Disjonction Max Requête peut-être que je vais manquer la forêt pour les arbres, mais là j'ai du mal à avoir les sous-requêtes être classés de manière aléatoire, seulement à l'intérieur d'eux-mêmes avant d'ajouter l'un à l'autre.

Voici comment j'écris une seule requête pour l'instant sans Disjunction Max Query, dans le cas où il permet de:

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

La meilleure réponse

0

La solution à ce problème n'est pas de faire 4 groupes distincts, mais plutôt de s'assurer qu'ils ont tous des gammes de scores et de tri par les scores. Ceci peut être réalisé, par la notation de la frappe pas par une sorte de critères de correspondance, mais par le biais d'un script-champ score. Ce champ vous permet d'écrire le code vous-même qui renvoie à une logique de partition (La langue par défaut est appelé "indolore", mais j'ai vu des exemples de groovy ainsi).

La logique est assez simple:

  1. Si isPlayer = true, ajouter 2 points pour le score
  2. Si isEvil = true, ajouter 4 points pour le score
  3. De toute façon, ajouter un nombre aléatoire entre 0 et 1 pour le score à la fin

Cela crée le 4 groupes que je voulais, avec distinctes score-plages:

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

La requête devrait ressembler à ceci:

  "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

Dans d'autres langues

Cette page est dans d'autres langues

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