ElasticSearch - Объединение запросов для 4 отдельных случайно выбранных групп?

0

Вопрос

Я довольно новичок в elasticsearch (хотя и обладаю изрядным опытом работы с SQL) и в настоящее время пытаюсь составить правильный запрос. У меня есть 2 логических поля isPlayer и isEvil что запись является либо true или false на основе этого я хочу разделить свой набор данных на 4 группы:

  1. isPlayer: верно, isEvil: верно
  2. isPlayer: истина, isEvil: ложь
  3. isPlayer: ложь, isEvil: истина
  4. isPlayer: ложь, isEvil: ложь

Эти группы я хочу случайным образом отсортировать внутри себя, а затем объединить их в один длинный список, который я могу разбить на страницы. Я бы хотел сделать это внутри запроса, так как это кажется "правильным" способом сделать это, так как я бы сделал это аналогично в SQL. В этом списке группы должны быть отсортированы по порядку, поэтому сначала все записи группы 1 в случайном порядке, затем все записи группы 2 в случайном порядке, затем все записи группы 3 и т.д. . Необходимо, чтобы случайность сортировки была воспроизводимой, если заданы одни и те же входные данные, поэтому, если сортировка основана на random_score в идеале я бы использовал семя для случайности.

Я могу создать один запрос, но как мне объединить 4?

В качестве подходов, которые я нашел до сих пор, я использовал запрос MultiSearch и Disjunction Max. Похоже, что MultiSearch не поддерживает разбиение на страницы. Что касается запроса дизъюнкции Max, возможно, мне не хватает леса для деревьев, но я изо всех сил стараюсь, чтобы подзапросы были случайным образом отсортированы только внутри самих себя, прежде чем добавлять их друг к другу.

Вот как я пишу один запрос на данный момент без Disjunction Max Query, на случай, если это поможет:

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

Лучший ответ

0

Решение этой проблемы заключается не в создании 4 отдельных групп, а в обеспечении того, чтобы все они имели разные диапазоны баллов и сортировались по баллам. Этого можно достичь, оценивая попадания не по каким-то критериям соответствия, а с помощью поля оценки сценария. Это поле позволяет вам самостоятельно написать код, который возвращает логическую оценку (язык по умолчанию называется "безболезненный", но я также видел примеры groovy).

Логика довольно проста:

  1. Если isPlayer = true, добавьте 2 балла к баллу
  2. Если isEvil = true, добавьте 4 балла к баллу
  3. В любом случае, добавьте случайное число от 0 до 1 к счету в конце

Это создает 4 группы, которые я хотел, с различными диапазонами баллов:

  1. isPlayer = true, isEvil = true --> Диапазон оценок: 6-7
  2. isPlayer = ложь, isEvil = истина --> Диапазон оценок: 4-5
  3. isPlayer = true, isEvil = false --> Диапазон оценок: 2-3
  4. isPlayer = ложь, isEvil = ложь --> Диапазон оценок: 0-1

Запрос будет выглядеть следующим образом:

  "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

На других языках

Эта страница на других языках

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

Популярное в этой категории

Популярные вопросы в этой категории