ElasticSearch - la Combinación de Consultas para 4 separados al azar sourted grupos?

0

Pregunta

Soy bastante nuevo en elasticsearch (aunque con un poco justo de SQL experiencia) y actualmente estoy luchando con poner una consulta adecuada juntos. Tengo 2 campos booleanos isPlayer y isEvil que una entrada es true o false en. Basado en eso, quiero dividir mi conjunto de datos en 4 grupos:

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

Estos grupos quiero ordenar aleatoriamente dentro de sí mismos, a continuación, adjuntar a ser una larga lista que puedo paginar. Me gustaría hacer que dentro de la consulta, como que se parece a la manera "correcta" de hacerlo, ya que me gustaría hacerlo de manera similar en SQL. En esa lista, los grupos se clasifican en orden, así que primero todas las entradas de Grupo 1 en un orden aleatorio, entonces todas las entradas de Grupo 2 en un orden aleatorio, entonces todas las entradas de Grupo 3, etc. . Es necesario que la aleatoriedad de la selección es reproducible si se les da las mismas entradas, así que si la clasificación se basa en random_score lo ideal sería el uso de una semilla para la aleatoriedad.

Que se puede construir una sola consulta, pero ¿cómo puedo combinar 4?

Como los enfoques que he encontrado hasta ahora MultiSearch y Disyunción Max Consulta. MultiSearch parece que no admite la Paginación. Con respecto a la Disyunción Max Consulta podría ser que me estoy perdiendo el bosque por los árboles, pero no estoy luchando por tener las subconsultas ser ordenados aleatoriamente sólo dentro de sí mismos antes de añadir la una a la otra.

Aquí cómo escribir una sola consulta por ahora sin Disjunction Max Queryen caso de que ayuda a:

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

Mejor respuesta

0

La solución a este problema no es hacer 4 grupos separados, pero en lugar de garantizar que todos ellos tienen diferentes rangos de puntuaciones y la clasificación por puntos. Esto puede lograrse, por la puntuación de los hits no por algún tipo de coincidencia de criterios, sino a través de una secuencia de comandos de puntuación de campo. Este campo le permite escribir código que devuelve una lógica de puntuación (el idioma predeterminado es El llamado de "sin dolor", pero he visto ejemplos de groovy así).

La lógica es bastante simple:

  1. Si isPlayer = true, añadir 2 puntos a la puntuación
  2. Si isEvil = true, para sumar 4 puntos a la puntuación
  3. De cualquier manera, añada un número aleatorio entre 0 y 1 a la puntuación al final

Esto crea los 4 grupos a los que quería con distinta puntuación-rangos:

  1. isPlayer = true, isEvil = true --> Puntuación de rango: 6-7
  2. isPlayer = false, isEvil = true --> Puntuación de rango: 4-5
  3. isPlayer = true, isEvil = false --> Puntuación de rango: 2-3
  4. isPlayer = false, isEvil = false --> Puntuación de rango: 0-1

La consulta tendría este aspecto:

  "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

En otros idiomas

Esta página está en otros idiomas

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