Агрегация Elasticsearch довольно сложно - PullRequest
0 голосов
/ 29 августа 2018

Это мой первый вопрос по StackOverflow !! Я застрял в Elasticsearch, поэтому искал помощи.

Вот моя проблема. У меня есть список людей, имеющих значение WIN или LOST для некоторых событий

ввод:

|name  | result | event|
------------------------
|Marc  | WIN    | game1|
|Marc  | WIN    | game2|
|Gabe  | WIN    | game1|
|James | WIN    | game1|
|James | LOST   | game2|
|John  | LOST   | game1|
|John  | LOST   | game2|

Допустим, код выше представляет мои данные. Я хочу получить 3 запроса.

  • 1, дающий мне игроков, всегда побеждающих (идеальные победители)
  • 1 дает игрокам всегда проигрывать (идеальные проигравшие)
  • 1 дает игрокам возможность выполнять оба (сбалансировано)

Первый запрос на возвращение Марка и Гейба, двух игроков, которые никогда не проигрывали:

{
  "name": "Marc"
},
{
  "name": "Gabe"
}

Вторая просьба вернуть Джеймса, потому что он проиграл игру и выиграл другую:

{
  "name": "James"
}

Третий запрос, возвращающий Джона, который проигрывал каждую игру (думаю, он плохой):

{
  "name": "John"
}

Я попробовал несколько вещей, но потерпел неудачу. Вот мои попытки:

Я попытался выполнить агрегацию по Имени и отфильтровал (в сегменте 'must') результаты WIN или LOST, но игроки, у которых есть WIN и LOST, вызывают у меня проблемы, потому что они появляются в наборах победителей и проигравших.

Я хотел сделать объединение между игроками, имеющими WIN, и игроками, имеющими LOST, чтобы получить набор игроков, имеющих WIN и LOST, или исключить один набор из другого и получить игроков, имеющих только WIN или только LOST, но это способ SQL мышления. Это не решение Elasticsearch, и синтаксис не позволяет этого делать (к сожалению, мне не удается обойтись без наборов игроков)

Другое решение состоит в том, чтобы создать один запрос, отображающий тип проигрывателя (WINNER, LOSER, MID), а затем применить фильтр для выбора только нужного типа, но субагрегации доставили мне затруднения, и я полностью потерпел неудачу. на этом пути (если у вас есть решение, было бы здорово).

Наконец, решение будет состоять в том, чтобы отображать номера WIN и номера LOST для каждого игрока (и я выполнил запрос), но это не совсем то, что я хочу, потому что победители, проигравшие и середина расплавлены.

GET /_search
{ 
    "size": 0, 
    "query": {
      "bool" : {
        "must": [],
        "filter": {
          "range": {
            "@timestamp": {
                "lte": "30/08/2018",
                "gte": "27/06/2018",
                "format": "dd/MM/yyyy"
            }
          }
        }
      }
    },
    "aggs" : {
        "my_buckets": {      
            "terms": {
                "field": "name.keyword",
                "size": 20
            },
            "aggs": {
                "GroupByType": {
                    "terms": {
                        "field": "result.keyword",
                        "size": 100
                    }
                }
            }            
        }
    }
}

Возможно, фильтр для получения результатов, имеющий счетчик WIN> 0 и счетчик LOST == 0, мог бы сделать эту работу, но я не нашел правильный синтаксис для такой вещи.

Так что у меня заканчиваются идеи, и я прыгал, чтобы найти какую-то помощь здесь.

Заранее спасибо. И не стесняйтесь спрашивать меня больше деталей, если я не был достаточно ясен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...