Elasticsearch как подсчитать конкретные значения из нескольких полей во всех документах индекса?

#elasticsearch

Вопрос:

У меня есть турнирная таблица WRC в моем индексе ES. У каждого водителя есть свой собственный документ. введите описание изображения здесь

Сопоставление для этого индекса:

 `{
  "properties" : {
    "Argentina pts" : {
      "type" : "long"
    },
    "Argentina result" : {
      "type" : "long"
    },
    "Chile pts" : {
      "type" : "long"
    },
    "Chile result" : {
      "type" : "long"
    },
    "Driver" : {
      "type" : "keyword"
    }
    "Nationality" : {
      "type" : "keyword"
    }
    "Team" : {
      "type" : "keyword"
    },
    "Total" : {
      "type" : "long"
    },
    "Position" : {
      "type" : "long"
    }`
 

Пример документа:

 "_source" : {
      "Argentina pts" : 30,
      "Argentina result" : 1,
      "Chile pts" : 30,
      "Chile result" : 1,
      "Driver" : "O. TANAK",
      "Nationality" : "Estonia",
      "Team" : "Toyota",
      "Total" : 263,
      "Position" : 1,

    }
 

Вопрос

Как подсчитать выигрыши водителей в зависимости от result полей? Я пробовал разные запросы и/или агрегации, но самый близкий результат, который я получил, — это водители, по крайней мере, с одной победой в сезоне ( я использовал multi_match для этого). Я не нашел ответа в документации Stack или Elastic. Я не знаю, как искать документы «вертикально» по нескольким полям и создавать агрегации по выбранным полям.

Редактировать

Я хочу, чтобы для каждого драйвера учитывались только result поля, равные 1. Так, например, если водитель выиграл в Монако ( Monaco result =1), запрос/скрипт увеличит его счетчик выигрышей.

Пример ответа

 {
"Driver" : "a",
"Win count": 3
},
{
"Driver" : "b",
"Win count": 2
},
{
"Driver" : "c",
"Win count": 1
}
 

Комментарии:

1. Можете ли вы привести мне пример того, чего вы хотите? просто для ясности.

2. @nimeresam добавил пример

3. Что классифицируется как победа? просто position поле, равное 1? или вам нужно иметь Chile result =1, если Nationality =»Чили»?

4. @RonSerruya извините, что я должен упомянуть об этом. Ваш смысл верен. Выигрыш, например Chile result , равен = 1 и больше ничего.

Ответ №1:

Таким образом, учитывая определение «выигрыша», заключающееся в том, что <Driver nationality> result == 1, вы можете использовать этот запрос

 {
  "query": {
    "script": {
      "script": "def nat = doc['Nationality'].value; return doc[nat   ' result'].value == 1"
    }
  }
}