ElasticSearch - Łączenie zapytań dla 4 wybranych losowo wybranych grup?

0

Pytanie

Jestem dość początkujący w elasticsearch (choć mam ogromną doświadczeniem w pracy z SQL) i obecnie staram się sporządzić odpowiedni wniosek. Mam 2 pola logicznych isPlayer i isEvil że wpis jest albo true lub false na podstawie tego chcę podzielić swój zestaw danych na 4 grupy:

  1. isPlayer: prawda, isEvil: tak
  2. isPlayer: prawda, isEvil: kłamstwo
  3. isPlayer: kłamstwo, isEvil: prawda
  4. isPlayer: kłamstwo, isEvil: kłamstwo

Grupy te chcę losowo sortować wewnątrz siebie, a następnie połączyć je w jedną długą listę, który mogę podzielić na strony. Chciałbym zrobić to wewnątrz wniosku, tak jak to wydaje się "właściwym" sposobem, aby to zrobić, tak jak ja bym to zrobił podobnie w SQL. W tym liście grupy powinny być sortowane w kolejności, więc najpierw wszystkie nagrania grupy 1 w kolejności losowej, a następnie wszystkie nagrania grupy 2 w kolejności losowej, a następnie wszystkie nagrania grupy 3, itp . Konieczne jest, aby przypadkiem sortowania był odtwarzany, jeśli są ustawione te same dane wejściowe, więc jeśli sortowanie jest oparta na random_score najlepiej byłoby, gdybym użył nasienie do przypadkowości.

Mogę stworzyć jeden wniosek, ale jak mi się połączyć 4?

Jako podejścia, które znalazłem do tej pory używałem zapytanie MultiSearch i Disjunction Max. Wygląda na to, że MultiSearch nie obsługuje podział na strony. Co do zapytania дизъюнкции Max, być może, brakuje mi lasów dla drzew, ale staram się ze wszystkich sił, aby podzapytania zostały losowo sortowane tylko wewnątrz siebie, przed dodaniem ich do siebie.

Oto jak piszę jedno zapytanie w tej chwili bez Disjunction Max Queryna wypadek , jeśli to pomoże:

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

Najlepsza odpowiedź

0

Rozwiązanie tego problemu polega na tworzeniu 4 poszczególnych grup, a w zapewnieniu, aby wszystkie miały one różne zakresy punktów i сортировались wynik. Można to osiągnąć, oceniając kontaktu nie według jakiś kryteriów zgodności, a za pomocą pola oceny scenariusza. To pole pozwala ci samodzielnie napisać kod, który zwraca wartość logiczną ocenę (domyślny język nazywa się "bezboleśnie", ale widziałem też przykłady groovy).

Logika jest bardzo prosta:

  1. Jeśli isPlayer = true, dodaj 2 punkty do punkt
  2. Jeśli isEvil = true, dodaj 4 punkty do punkt
  3. W każdym razie, dodaj losową liczbę od 0 do 1 do rachunku w końcu

To tworzy 4 grupy, które chciałem, z różnymi zakresami punktów:

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

Zapytanie będzie wyglądać w następujący sposób:

  "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

W innych językach

Ta strona jest w innych językach

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