ElasticSearch - Combinação de Consultas para 4 separadas aleatoriamente sourted grupos?

0

Pergunta

Eu sou bastante novo para elasticsearch (embora com um pouco de SQL experiência) e atualmente estou lutando com a colocação de uma consulta adequada juntos. Eu tenho 2 campos booleanos isPlayer e isEvil que uma entrada é true ou false em. Com base no que eu queira dividir a minha conjunto de dados em 4 grupos:

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

Estes grupos quero aleatoriamente de classificação, dentro de si, em seguida, anexá-los a ser um grande lista que eu possa paginar. Eu gostaria de fazer que, dentro da consulta, como parece ser o "correto" para fazer isso, desde que eu iria fazê-lo da mesma forma em SQL. Nessa lista, os grupos devem ser organizados em ordem, então, primeiro, todas as entradas do Grupo 1 em uma ordem aleatória, em seguida, todas as entradas do Grupo 2 em uma ordem aleatória, em seguida, todas as entradas do Grupo 3, etc. . É necessário que a aleatoriedade da classificação é reproduzível se dado as mesmas entradas, então, se a classificação é baseada no random_score idealmente, eu gostaria de estar usando uma semente para a aleatoriedade.

Eu posso construir uma única consulta, mas como faço para combinar 4?

Como abordagens que encontrei até o momento MultiSearch e Disjunção Max Consulta. MultiSearch parece que ele não oferece suporte a Paginação. Relação de Disjunção Max Consulta pode ser que eu estou faltando a floresta para as árvores, mas eu estou lutando em ter subconsultas ser ordenados aleatoriamente apenas dentro de si antes de acrescentá-los um ao outro.

Aqui como eu escrever uma única consulta por agora sem Disjunction Max Queryno caso, ele ajuda a:

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

Melhor resposta

0

A solução para este problema não é fazer 4 grupos separados, mas em vez disso, assegurando que todos eles têm diferentes intervalos de pontuação e a classificação por pontuação. Isto pode ser conseguido, ao marcar os hits não por algum tipo de critérios de correspondência, mas através de um script-pontuação de campo. Este campo permite-lhe escrever código que retorna uma lógica de pontuação (O idioma padrão é chamado de "indolor", mas eu já vi exemplos de groovy bem).

A lógica é bastante simples:

  1. Se isPlayer = true, adicione 2 pontos para a pontuação
  2. Se isEvil = true, adicione 4 pontos para a pontuação
  3. De qualquer forma, adicionar um número aleatório entre 0 e 1 para a pontuação no final

Isso cria os 4 grupos, eu queria com distintas pontuação intervalos:

  1. isPlayer = true, isEvil = true --> Escore-alcance: 6-7
  2. isPlayer = false, isEvil = true --> Escore-alcance: 4-5
  3. isPlayer = true, isEvil = false --> Escore-intervalo: 2-3
  4. isPlayer = false, isEvil = false --> Escore-intervalo: 0-1

A consulta teria esta aparência:

  "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

Em outros idiomas

Esta página está em outros idiomas

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